Звуковой сигнал на Linux в C
Я хочу генерировать звуковой сигнал с определенной частотой и длиной (для разных звуковых сигналов), используя системный звуковой сигнал (и только динамики, если звуковой сигнал недоступен / недоступен). Я знаю, что это можно сделать с помощью ioctl, но для этого Требуется root-доступ, который я не хочу.
Я знаю, что могу просто использовать команду "beep", но это будет зависимость, которая, если возможно, не должна использоваться (никаких внешних зависимостей вообще, только основные библиотеки linux и в).
в настоящее время у меня есть следующий код (но для этого требуются привилегии суперпользователя):
#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])));
}
если нет другого способа сделать это, я буду использовать звуковой сигнал, но я бы очень хотел избежать зависимостей и интегрировать звуковой сигнал непосредственно в мой скрипт, но я уверен, что кто-то здесь будет знать решение / обходной путь.
Я действительно не хочу внешних библиотек, так как программа должна быть максимально легкой.
4 ответов
пожалуйста, посмотрите на стандартный linux beep
исходный код.
http://www.johnath.com/beep/beep.c
Он использует KIOCSOUND ioctl для "beep", но вам не нужны привилегии суперпользователя, чтобы заставить его играть. Я настроил его для чтения и выполнения пользователями в группе "beep".
таким образом, мой стандартный пользователь с UID 1000 находится в группе С GID 501 (я назвал его "beep").
Рядом с этим я должен был chmod 4750 /usr/bin/beep
и теперь я могу воспроизводить звуковые сигналы (в диапазоне 20-20000Hz) не спрашивая привилегий суперпользователя.
Я думаю, что единственный способ сделать это-либо использовать suid для предоставления моей собственной корневой программы, либо использовать beep
, который уже имеет suid. Полагаю, я просто добавлю еще одну зависимость, тогда, как beep
не слишком большой.
Спасибо за все ответы, я уверен, другими библиотеками для более сложных сигналов, но мне нужен очень простой!
Я думаю, что этот вопрос можно отметить как решенный / закрытый.
Если кто-нибудь найдет способ создайте звуковой сигнал с помощью консоли без привилегий суперпользователя, меня все еще интересует это решение:)
еще раз спасибо всем.
самый простой звуковой сигнал по-прежнему "\a", если ваш терминал поддерживает его:
fprintf(stdout, "\aBeep!\n" );