Starten eines Programms mit Übergabe von Parametern

Zudem wäre noch hinzuzufügen, dass weder sleep() noch usleep() thread-safe sind. Sie benutzen nämlich Interrupts SIGALRM, was sich blöderweiße immer auf das komplette Programm (also auch Threads) auswirkt. Daher sollte man, wie Matthias es vorgeschlagen hat, nanosleep() verwenden. Das kommt ohne Verwendung von SIGALRM aus.
 
Zudem wäre noch hinzuzufügen, dass weder sleep() noch usleep() thread-safe sind. Sie benutzen nämlich Interrupts SIGALRM, was sich blöderweiße immer auf das komplette Programm (also auch Threads) auswirkt.
Wenn dem so ist, dann ist das ein Bug. Dokumentiert ist nämlich (z.B. hier und dort), dass nur der aktuelle Thread pausiert wird. Dieses Verhalten habe ich auch gerade unter Ubuntu 12.04 so beobachten können. Ob das auf dem System vom OP auch so ist, weiß ich allerdings nicht.

Grüße
Matthias
 
Nein, das ist kein Bug und es ist genau so dokumentiert, wie ich es beschrieben habe:

the calling thread sleep until seconds seconds have elapsed or a signal arrives which is not ignored.

... oder ein Signal eintrifft, was nicht ignoriert wird. SIGALRM ist ein Signal was nicht ignoriert wird. Wenn man jetzt zwei Threads hat, die unabhängig von einander schlafen sollen, wird das SIGALRM, das beim Eintreten des Timeouts gesendet wird, das Schlafen des anderen Threads beenden. Genau diese Problematik hatte ich in einem Multithreaded Programm und bin seit dem ziemlich hellhörig was das angeht ;-)

EDIT: Und es wäre ziemlich sinnfrei, SIGALRM auf eine Sigmask zu legen, wenn man sleep() verwenden will ;-)
 
Zuletzt bearbeitet:
Danke !

Wie schaffe ich es das das Programm sich alle 60s von alleine neu startet. Am besten im Hintergrund ohne Ausgabe auf der Konsole.

Hallo,

neben den Varianten mit Sleep könntest du eventuell auch einen Cron-Job benutzen, der dein Executable alle 60 Sekunden einmal started. Das müsste auch gehen, auch gehen.

Ansonsten kannst du dir auch einen eigenen kleinen Daemon schreiben, der bei jedem Start deines Raspberrys automatisch im Hintergrund gestartet wird und die usleep, nanosleep oder clock_nanosleep Funktion verwendet um dein Programm neu zu starten. Je nachdem welche Genauigkeit du für deine Zeitintervalle benötigst.

Viele Grüße,
Der Wolf
 
... oder ein Signal eintrifft, was nicht ignoriert wird. SIGALRM ist ein Signal was nicht ignoriert wird. Wenn man jetzt zwei Threads hat, die unabhängig von einander schlafen sollen, wird das SIGALRM, das beim Eintreten des Timeouts gesendet wird, das Schlafen des anderen Threads beenden.
Dann habe ich dich zunächst falsch verstanden. Ich dachte du meintest, dass ein sleep in einem Thread sämtliche anderen Threads des Prozesses auch pausieren lässt.

Aber auch dein beschriebenes Verhalten kann ich nicht nachvollziehen. Auf welchem System hattest du dieses Problem? Die aktuellen Versionen von glibc und BSD libc verwenden jedenfalls kein SIGALRM für sleep (sie delegieren stattdessen an nanosleep).

Grüße
Matthias
 
Auf einem CentOS 6. Wie hast du das getestet? Mittels strace konnte ich es seinerzeit sehen. Und hier steht es sogar bei "BUGS" beschrieben, das sleep() möglicherweise SIGALRM benutzen kann.

EDIT: Aber interessant, dass das "Problem" erkannt und anscheinend auch schon "behoben" wurde. Mag sein, das CentOS schon etwas in die Tage gekommen ist.
 
Zuletzt bearbeitet:
Ich habe zuerst ein Testprogramm geschrieben, das mehrere Threads startet und in diesen unterschiedlich lange wartet. Als das ohne Probleme funktionierte, habe ich den Quellcode gelesen.

Ich weiß leider nicht wie die glibc in CentOS 6 konfiguriert ist, aber wie es scheint wird nicht dieselbe Implementierung von sleep verwendet wie unter Ubuntu. Es gibt zumindest im Quellcode der glib 2.14 (welche CentOS 6 mitliefert) auch eine Implementierung mit SIGALRM. In der aktuellen Version wurde diese Implementierung aber auch schon durch eine mit nanosleep ersetzt.

Aber gut zu wissen, dass es mit sleep und Threads zu Problemen kommen kann, das war mir bisher nicht bewusst.

Grüße
Matthias
 

Neue Beiträge

Zurück