Dav*_*oua 5 linux permissions gcc c
我编写了一个小型 C 应用程序来利用内部 PC 的扬声器。为了实现这一点,我正在与/dev/console它交谈,然后从扬声器发出哔哔声。
但是,我编译的可执行文件仅在我以root. 我知道我应该将运行可执行文件的用户添加到适当的组,但我不知道也无法找出哪些组具有所需的权限。
以我当前尝试以 ( apache)身份运行的用户身份运行可执行文件给我Permission denied.
请问有什么帮助吗?
您可以像控制对文件的访问一样控制对设备的访问:通过查看权限和所有权,并以具有访问权限的用户或具有访问权限的组成员的身份执行程序。
但是,至少在我的系统上,
$ ll /dev/console
crw------- 1 root root 5, 1 Nov 29 06:59 /dev/console
Run Code Online (Sandbox Code Playgroud)
的权限/dev/console仅限于 root(可能有充分的理由),因此您要么需要以 root 身份运行它,要么修改udev规则以/dev/console使用不同的组创建,然后以该组的成员身份运行该程序(使用 setgid位,或其他)。
但是有一种更好的方法来访问 PC 扬声器(鲜为人知):扬声器显示为输入事件设备,通过以正确的格式写入,您可以直接控制扬声器(包括频率)。与系统无关的符号链接是
/dev/input/by-path/platform-pcspkr-event-spkr
Run Code Online (Sandbox Code Playgroud)
如果你按照符号链接,你应该看到类似于
$ ll /dev/input/by-path/platform-pcspkr-event-spkr
lrwxrwxrwx 1 root root 9 Nov 29 06:57 /dev/input/by-path/platform-pcspkr-event-spkr -> ../event5
$ ll /dev/input/event5
crw-rw---- 1 root input 13, 69 Nov 29 06:57 /dev/input/event5
Run Code Online (Sandbox Code Playgroud)
因此该input组的任何成员都可以写入此设备,这比将其作为root.
输入系统使用的事件格式在/usr/src/linux/Documentation/input/input.txt和 包含文件中描述。它归结为
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
}
Run Code Online (Sandbox Code Playgroud)
具有EV_SND(“声音”)类型,即0x12。只需将这样的结构写入文件即可。为此,您甚至不需要 C,命令行中的 perl 即可,例如:
perl -e 'print pack("qssl", 0, 0x12, 2, 2000)' > /dev/input/by-path/platform-pcspkr-event-spkr
Run Code Online (Sandbox Code Playgroud)
并关闭蜂鸣声
perl -e 'print pack("qssl", 0, 0x12, 2, 0)' > /dev/input/by-path/platform-pcspkr-event-spkr
Run Code Online (Sandbox Code Playgroud)