6

我在 [linux 设备驱动程序] 一书中读到了这行脚本。它有什么作用?

major=$(awk "\\$2=  =\"$module\" {print \\$1}" /proc/devices)

如上下文:

#!/bin/sh
module="scull"   
device="scull"  
mode="664"

# invoke insmod with all arguments we got  
# and use a pathname, as newer modutils don't look in . by default

/sbin/insmod ./$module.ko $* || exit 1


# remove stale nodes  
rm -f /dev/${device}[0-3]   

major=$(awk "\\$2=  =\"$module\" {print \\$1}" /proc/devices)

mknod /dev/${device}0 c $major 0
....
4

3 回答 3

8

写这个的更好的方法是:

major=$(awk -v mod=$module '$2==mod{print $1}' /proc/devices)
于 2012-12-19T12:20:07.193 回答
2

我也读过这个,但那条线对我不起作用。我不得不将其修改为

major=$(awk "\$2 == \"$module\" {print \$1}" /proc/devices)

第一部分\$2 == \"$module\"是模式。当满足此条件时,即第二列等于“scull”时,print \$1执行打印第一列的命令。该值存储在变量major 中。需要转义,$因为它们需要按原样传递给 awk。

于 2012-12-19T11:54:06.860 回答
1

/proc/devices包含每个模块当前配置的字符设备和块设备。

在您的上下文中扩展一些变量,并修复等式中的语法错误,该命令如下所示:

awk '$2=="scull" {print $1}' /proc/devices

这意味着“如果第二列的值为scull,则输出第一列”。

该命令在子shell 中运行$(...)——并且输出分配给变量$major

目的的解释在书中

因此,加载已分配动态编号的模块的脚本可以使用诸如awk检索信息之类的工具编写/proc/devices,以便在/dev.

请注意,在分布式示例中,中的行scull_load与 Vivek 的更正匹配。

于 2012-12-19T11:45:31.383 回答