Beep su Linux in C

Voglio generare un segnale acustico con una frequenza e una lunghezza specifiche (per diversi segnali audio) usando il cicalino di sistema (e solo gli altoparlanti se il segnale acustico non è disponibile / accessibile). So che è ansible farlo usando ioctl, ma questo richiede l’accesso root, che non voglio.

So che potrei semplicemente usare il comando “beep“, ma sarebbe una dipendenza, che, se ansible, non dovrebbe essere usata (nessuna dipendenza esterna, solo le librerie linux di base e C).

Quello che attualmente ho è il seguente codice (ma questo richiede i privilegi di superutente per l’esecuzione):

#include  #include  #include  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]))); } 

Se non c’è altro modo per farlo, userò il beep, ma vorrei davvero evitare le dipendenze e integrare il beep direttamente nel mio script, ma sono sicuro che qualcuno qui conoscerà una soluzione / soluzione alternativa.

Non voglio librerie esterne in quanto il programma dovrebbe essere il più leggero ansible.

Si prega di guardare il codice sorgente del beep standard di Linux. http://www.johnath.com/beep/beep.c

Usa ioctl di KIOCSOUND su “beep”, ma non è necessario disporre dei privilegi di superutente per farlo funzionare. L’ho configurato per essere leggibile ed eseguibile dagli utenti sul gruppo “beep”.

Quindi il mio utente standard con UID 1000 è nel gruppo con GID 501 (l’ho chiamato “beep”). Accanto a questo ho dovuto chmod 4750 /usr/bin/beep e ora sono in grado di suonare beep (nell’intervallo 20-20000Hz) senza chiedere i privilegi di superutente.

Penso che l’unico modo per farlo sia usare suid per dare il mio accesso al root del programma, o per usare il beep , che ha già il suid. Suppongo che aggiungerò ancora una dipendenza, dato che il beep non è troppo grande.

Grazie per tutte le risposte, sono sicuro che altre librerie sono grandi per segnali più complessi, ma ho bisogno di una molto semplice!

Penso che questa domanda possa essere contrassegnata come risolta / chiusa, quindi.

Se qualcuno trova un modo per creare un segnale acustico utilizzando la console senza privilegi di superutente, sono ancora interessato a questa soluzione 🙂

Grazie ancora a tutti.

Il segnale acustico più semplice è ancora ‘\ a’, se il tuo terminale lo supporta:

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

Prova a utilizzare una libreria audio come OpenAL .