用C蜂鸣Linux上用C蜂鸣Linux上(Beep on Linux in C)

2019-05-13 11:12发布

我想用的系统警报器,以产生具有特定频率和长度(对于不同的声音信号)嘟嘟声(与仅扬声器如果蜂鸣器不可用/访问)。 我知道这是可能通过使用ioctl来做到这一点,但是这需要root访问权限,这是我不想要的。

我知道我可以只用“嘟”的命令,但是这将是一个依赖,这,如果可能的话,不应该使用(完全没有外部依赖,只是基本的Linux库和C)。

我现在拥有的是下面的代码(但是这需要超级用户权限运行):

#include <stdlib.h>
#include <fcntl.h>
#include <linux/kd.h>

int main(int argc, char *argv[])
{
 int fd = open("/dev/console", O_RDONLY);
 if (fd == -1 || argc != 3) return -1;
 return ioctl(fd, KDMKTONE, (atoi(argv[2])<<16)+(1193180/atoi(argv[1])));
}

如果没有其他办法可以做到这一点,那么我会用嘟嘟声,但我真的想避免依赖和蜂鸣直接集成到我的剧本,但我敢肯定,在这里有人会知道解决办法/解决方法。

我真的不希望外部库的程序应该是尽可能轻巧。

Answer 1:

请看标准的Linux beep源代码。 http://www.johnath.com/beep/beep.c

它采用KIOCSOUND ioctl来“嘟”,但你并不需要超级用户权限,使之发挥。 我已经配置它是通过在“哔”组用户可读和可执行。

所以我的UID为1000标准的用户是与GID 501的组(我把它叫做“嘟嘟”)。 下一步,这个我必须chmod 4750 /usr/bin/beep ,现在我可以不要求超级用户权限玩(范围为20-20000Hz)的哔哔声。



Answer 2:

我认为,要做到这一点的唯一方法是要么使用SUID给我自己的程序root访问权限,或者使用beep ,已经有替代用户标识。 我想我会只是增加一个依赖,那么,作为beep不是太大呢。

感谢您对所有问题的答案,我敢肯定,其他图书馆是伟大的更复杂的信号,但我需要一个很简单的!

我认为,作为解决/关闭,那么这个问题可以被标记。

如果有人发现了一种使用超级用户没有-特权控制台创建蜂鸣声,我仍然有兴趣在此解决方案:)

再次谢谢大家。



Answer 3:

最基本的蜂鸣声仍是“\一”,如果你的终端支持它:

fprintf(stdout, "\aBeep!\n" );


Answer 4:

尝试使用音频库,如OpenAL的 。



文章来源: Beep on Linux in C