Вы управляете доступом к устройству так же, как вы управляете доступом к файлу: просматривая разрешение и владение и выполняя программу либо как пользователь, имеющий разрешение на доступ, либо как член группы, имеющей разрешение на доступ.
Однако, по крайней мере, в моей системе,
$ ll /dev/console
crw------- 1 root root 5, 1 Nov 29 06:59 /dev/console
разрешения для /dev/console
ограничены только пользователем root (вероятно, по уважительным причинам), поэтому вам нужно либо запустить его как root, либо изменить правила udev
чтобы создать /dev/console
с другой группой, а затем запустить программу как член этой группы (с битом setgid или иным образом).
Но есть и лучший способ получить доступ к динамику ПК (который малоизвестен): динамик отображается как устройство события ввода, и, записав в него правильный формат, вы можете напрямую управлять динамиком (включая частоту). Системно-независимая символическая ссылка для этого
/dev/input/by-path/platform-pcspkr-event-spkr
и если вы перейдете по символической ссылке, вы должны увидеть что-то похожее на
$ 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
Таким образом, любой член группы input
может писать на это устройство, что безопаснее, чем запускать его от имени пользователя root
.
Формат событий, используемых системой ввода, описан в /usr/src/linux/Documentation/input/input.txt
и во включаемых файлах. Сводится к
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
}
с типом EV_SND
("звук"), то есть 0x12
. Просто напишите такую структуру в файл. Вам даже не нужен C для этого, Perl из командной строки подойдет, например:
perl -e 'print pack("qssl", 0, 0x12, 2, 2000)' > /dev/input/by-path/platform-pcspkr-event-spkr
и выключить звуковой сигнал
perl -e 'print pack("qssl", 0, 0x12, 2, 0)' > /dev/input/by-path/platform-pcspkr-event-spkr