4

我目前正在开发一个项目,以在插入 USB 设备时运行用 C 编写的程序。这可以通过 udev 规则实现吗?

当我插入我的设备时,我目前已经让它运行一个 Hello World 脚本。但是,它不止一次地运行它。

当前路径:/etc/udev/rules.d/98-local.rules

当前规则:

SUBSYSTEMS=="usb", ACTION=="add", RUN+="/usr/local/bin/USB.sh"

脚本路径:/usr/local/bin/USB.sh

脚本:

 #!/bin/bash
echo 'Hello World!' >>"/home/<username>/Desktop/udev.out"
exit

我已经尝试过这样的事情来让可执行文件运行:

 #!/bin/bash
usr/games/blackjack
exit

键入 usr/games/blackjack 可以在终端中工作,但是插入 USB 设备时它不起作用。但是,我知道脚本正在运行,因为我已经将它们组合在同一个文件中,并且已经创建了 hello world。

我还尝试从我的用户帐户运行可执行文件,如下所示:

SUBSYSTEMS=="usb", ACTION=='add", RUN+="/bin/su tyler -c '/usr/local/bin/USB.sh'"

但是,这也不起作用。

是设备权限的问题还是无法运行可执行文件?

*注意:我已经广泛阅读了http://reactivated.net/writing_udev_rules.html上的 udev 规则解释。

4

3 回答 3

2

如果你用 C 编写程序,你可以使用libudev。它具有简单的 API,允许枚举和监视设备。在这里你会找到很好的教程。

于 2011-08-31T14:40:32.983 回答
1

另一个原因可能是 udev 似乎在它自己的环境中运行。就像您从 tty 运行程序一样:它确实启动了,但没有 xserver...

但是,这纯粹是基于我自己的实验的推测。如果更了解 udev 的人能证实这一点,那就太好了。

编辑:将以下内容添加到您的脚本中:

set -x
xhost local:YOURUSERNAME
export DISPLAY=:0.0

也许重新加载你的规则udevadm control --reload-rules

(来源:http ://ubuntuforums.org/showthread.php?t=994233 )

于 2011-08-31T14:33:17.240 回答
0

如果你可以运行一个 shell 脚本,你就可以运行一个可执行文件。它是否由 C 创建并不重要。

你似乎错过了一个斜线。那条路几乎肯定应该是/usr/games/blackjack,不是user/games/blackjack

我不知道您是否在终端中正确输入了它而在脚本中输入不正确,或者您的环境是否不同。除非 UDEV 系统是为重新创建您的终端环境而刻意设计的,否则它们没有理由相同。

于 2011-01-24T22:06:17.603 回答