2012-04-09 41 views
9

Ich möchte mit dem Systempiepser einen Signalton mit einer bestimmten Frequenz und Länge (für verschiedene Tonsignale) erzeugen (und nur die Lautsprecher, wenn der Signalton nicht verfügbar/zugänglich ist). Ich weiß, dass es möglich ist, dies mit ioctl zu tun, aber das erfordert Root-Zugriff, den ich nicht will.Beep unter Linux in C

Ich weiß, ich könnte einfach den "Beep" -Befehl verwenden, aber das wäre eine Abhängigkeit, die, wenn möglich, sollte nicht verwendet werden (keine externen Abhängigkeiten, nur die grundlegenden Linux-Bibliotheken und C).

Was ich zur Zeit habe, ist der folgende Code (aber dies erfordert Privilegien Super-User laufen):

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

Wenn es keine andere Möglichkeit, dies zu tun ist, dann werde ich Piepton, aber ich würde wirklich gerne um Abhängigkeiten zu vermeiden und den Signalton direkt in mein Skript zu integrieren, aber ich bin mir sicher, dass jemand hier eine Lösung/Abhilfe kennt.

Ich möchte nicht wirklich externe Bibliotheken, da das Programm so leicht wie möglich sein sollte.

+0

Wenn Sie unter einem Desktop arbeiten, können Sie ALSA verwenden. Und Sie könnten auch den 'play' Befehl verwenden ... Und einige Desktops haben Benachrichtigungen ... –

+0

@BasileStarynkevitch Wäre das nicht übermäßig kompliziert Dinge? Ich möchte nur einen einfachen Piepton mit einer bestimmten Frequenz und Länge. Wie ich bereits Pablo gesagt habe, möchte ich es so leicht wie möglich halten, aber ich nehme an, dass die Verwendung von Beep oder Suid, um Root-Zugriff zu erhalten, der richtige Weg ist? – omnidan

+0

Sehen Sie, ob [dies] (http://stackoverflow.com/questions/412789/windows-beep-equivalent-for-linux) Ihnen hilft. @paxdiablo behauptet, dass es auch von einem Benutzerkonto ausgeführt werden kann. –

Antwort

3

Ich denke, der einzige Weg, dies zu tun ist, entweder suid zu verwenden, um meinen eigenen Programm root-Zugriff zu geben, oder beep zu verwenden, die bereits suid hat. Ich nehme an, ich werde nur eine weitere Abhängigkeit hinzufügen, dann ist beep sowieso nicht zu groß.

Vielen Dank für alle Antworten, ich bin sicher, dass andere Bibliotheken für komplexere Signale geeignet sind, aber ich brauche einen sehr einfachen!

Ich denke, diese Frage kann dann als gelöst/geschlossen markiert werden.

Wenn jemand einen Weg findet einen Piepton über die Konsole ohne Superuser-Privilegien zu schaffen, bin ich in dieser Lösung nach wie vor interessiert :)

Sie alles noch einmal danken.

0

Verwenden Sie eine Audiobibliothek wie OpenAL.

+0

Ich möchte das Programm so leicht wie möglich halten – omnidan

+0

Dann nur ausgeben ein Glockenzeichen '\ a' und lassen Sie den Sound-Maker zum Terminal-Emulator. Natürlich können Sie die Tonhöhe und den Klang dieses Klangs nicht ändern ... –

+0

@BasileStarynkevitch Ja, natürlich ist das auch möglich, aber ich möchte, dass bestimmte Frequenzen die Signale etwas unterscheiden. – omnidan

2

Der grundlegendste Piepton ist immer noch '\ a', wenn Ihr Terminal unterstützt:

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

Ja, aber das ist nur eine Frequenz. – omnidan

+0

Ich sagte, dass es einfach war ... Entschuldigung (die Reaktion könnte immer noch für Leute nützlich sein, die diese Seite später besuchen). – wildplasser

+0

Funktioniert auch nicht sehr gut, wenn die Ausgabe umgeleitet wird. –

4

Bitte schauen Sie auf dem Standard-Linux beep Quellcode. http://www.johnath.com/beep/beep.c

Es verwendet KIOCSOUND ioctl, um "Piep", aber Sie benötigen keine Superuser-Berechtigungen, um es zu spielen. Ich habe es so konfiguriert, dass es von Benutzern in der "beep" -Gruppe lesbar und ausführbar ist.

Also mein Standardbenutzer mit UID 1000 ist in der Gruppe mit GID 501 (ich nannte es "Piep"). Neben diesem musste ich chmod 4750 /usr/bin/beep und jetzt kann ich Piepsen (im Bereich 20-20000Hz) spielen, ohne nach Superuser-Privilegien zu fragen.