Ubuntu Linux Udev规则:是否可以通过udev规则运行用C语言编写的程序?

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规则解释。

你如何测试程序是否运行? - Ben Voigt
好的,我想要一个交互式程序以这种方式启动,所以在这个游戏的情况下,它会启动并且我能够玩它。我已经花费了大约10个小时的时间,开始觉得这是不可能的。 - Tyler
你的两个bash脚本在shebang (#!/bin/bash)前面有一个额外的空格。在这种情况下可能并不重要(脚本将使用默认的/bin/sh调用),但你应该修复它。 - Keith Thompson
3个回答

2
如果您使用C语言编写程序,可以使用 libudev。它具有简单的API,可用于枚举和监视设备。在这里您将找到一个不错的教程。

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)


0

如果你能让一个 shell 脚本运行起来,那么你也能让一个可执行文件运行起来。无论它是由 C 创建的还是其他方式。

你好像漏了一个斜杠。那个路径几乎肯定应该是 /usr/games/blackjack,而不是 user/games/blackjack

我不知道你是否在终端中正确地输入了它,但在脚本中却错误了,或者你的环境不同。除非 UDEV 系统有意设计成重新创建你的终端环境,否则它们之间没有任何理由相同。


1
这应该有助于启动进程,但泰勒似乎期望程序以交互方式运行,这将需要比仅仅正确获取路径更多的关注,如果可能的话。 - Ben Voigt
本是正确的。PS. Ben,你能告诉我你所谈论的照护类型吗?也许可以指引我正确的方向?我有点不知所措。 - Tyler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接