Você controla o acesso a um dispositivo da mesma forma que controla o acesso a um arquivo: Observando a permissão e a propriedade, e executando o programa como o usuário com permissão de acesso ou como membro do grupo com permissão de acesso.
No entanto, pelo menos no meu sistema,
$ ll /dev/console
crw------- 1 root root 5, 1 Nov 29 06:59 /dev/console
as permissões para /dev/console
estão restritas apenas à raiz (provavelmente por boas razões), portanto, você precisa executá-la como raiz ou modificar as regras udev
para criar /dev/console
com um grupo diferente e, em seguida execute o programa como membro deste grupo (com o bit setgid ou outro).
Mas há uma maneira melhor de acessar o alto-falante do PC (que é pouco conhecido): o alto-falante aparece como um dispositivo de entrada de evento e, ao gravar no formato correto, você pode controlar diretamente o alto-falante ). O symlink independente do sistema para isso é
/dev/input/by-path/platform-pcspkr-event-spkr
e se você seguir o link simbólico, verá algo semelhante a
$ 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
Assim, qualquer membro do grupo input
pode gravar neste dispositivo, o que é mais seguro do que executá-lo como root
.
O formato dos eventos usados pelo sistema de entrada é descrito em /usr/src/linux/Documentation/input/input.txt
e nos arquivos de inclusão. Tudo se resume a
struct input_event {
struct timeval time;
unsigned short type;
unsigned short code;
unsigned int value;
}
com um tipo de EV_SND
("som"), ou seja, 0x12
. Basta escrever tal estrutura no arquivo. Você nem precisa de C para isso, o perl da linha de comando fará, por exemplo:
perl -e 'print pack("qssl", 0, 0x12, 2, 2000)' > /dev/input/by-path/platform-pcspkr-event-spkr
e para desligar o sinal sonoro
perl -e 'print pack("qssl", 0, 0x12, 2, 0)' > /dev/input/by-path/platform-pcspkr-event-spkr