Starten Sie einen Prozess im Hintergrund in Linux mit C

8

Ich versuche hier etwas Seltsames zu tun. Ich muss einen Prozess, logcat, von einem Deamon starten, der im Hintergrund läuft und zum Terminal druckt, ohne Kontrolle über stdin zu nehmen. Es dient zum Protokollieren, daher wird logcat logarithmische Meldungen ausgeben, während der Benutzer weiterhin Standardbefehle eingeben und Programme von der Shell initialisieren kann. Hier ist der Code für den Daemon, den ich bisher habe. Das Programm, logcat, startet und zeigt Logmeldungen an, aber ich kann keine Befehle in stdin eingeben, da das Programm anscheinend die Kontrolle über stdin übernommen hat.

%Vor%

Danke

    
Mike 04.08.2010, 15:38
quelle

3 Antworten

4

Der Befehl 'logcat' scheint für die Android-Entwicklung zu sein - das könnte etwas seltsam erklären Ort des Befehls.

Die Schlüsseloperation, die Sie beheben müssen, besteht darin, sicherzustellen, dass Sie Ihre aktuelle Standardeingabe (das Terminal) schließen und /dev/null/ für das Eingabegerät öffnen:

%Vor%

Dies bedeutet, dass Ihr daemonisierter untergeordneter Prozess nichts vom Terminal lesen wird.

Was ich denke, dass du willst, ist:

  1. Führen Sie Ihr Launcher-Programm über eine Befehlszeile aus, bei der Standardeingabe, Standardausgabe und Standardfehler mit dem Terminal verbunden sind.
  2. In Ihrem Programm möchten Sie die Standardeingabe ersetzen, sodass sie von /dev/null .
  3. kommt
  4. Sie möchten die Standardausgabe allein lassen - Sie möchten logcat in die aktuelle Standardausgabe schreiben.
  5. Wahrscheinlich möchten Sie auch den Standardfehler alleine lassen.

Irgendwann im Laufe des Verfahrens machen Sie Ihre Daemonisierung ordnungsgemäß (den Link ausleihen) von @ bstpierres Antwort), stellen Sie sicher, dass das Terminal, mit dem Sie verbunden sind, nicht Ihr kontrollierendes Terminal ist, sodass Interrupts und Hangups, die an das Terminal gesendet werden, keinen Einfluss auf Ihren Daemon haben. Die Installation ist einfacher als das, was Sie eingerichtet haben - Sie sollten mit der Standardeingabe arbeiten und Standardausgabe und Standardfehler unverändert lassen (anstatt die Ausgaben zu ändern und den Eingang unverändert zu belassen).

Nun möchten Sie vielleicht, dass die Ausgabe zu /dev/console ; Wenn ja, ist es sinnvoll, den Code zu ändern, um /dev/console zu öffnen. Es ist jedoch nicht sinnvoll, auf /dev/null zurückzugreifen, wenn Sie /dev/console nicht öffnen können. Ihr Programm sollte einen Fehler melden und scheitern (weil es keinen Sinn macht, Logcat in /dev/null zu schreiben!). Stellen Sie sicher, dass Sie die Konsole mit dem O_NOCTTY -Flag öffnen, damit es nicht zum steuernden Terminal für den Daemon wird.

Der letzte Kommentar, den ich machen würde, ist:

  • Möchten Sie wirklich, dass zufälliger Text über Ihrem Terminal oder Ihrer Konsole erscheint, wenn er für andere Dinge verwendet wird?

Ich mag es nicht sehr, wenn das passiert.

Siehe auch: SO 958249

    
Jonathan Leffler 04.08.2010, 16:02
quelle
4

Wie man in Linux dämonisiert [toter Link]

So dämonisieren Sie unter Linux [Wayback-Archiv der oben genannten]

gib auf github - Code aus dem obigen Link

Zusammenfassung:

  

Eines der Dinge, die ich immer wieder durchlaufe, sind Linux-Dämonen, die sich selbst nicht richtig dämonisieren. Um ordnungsgemäß zu dämonisieren, müssen die folgenden Schritte befolgt werden.

     
  • Der Aufruf von fork () wird verwendet, um einen separaten Prozess zu erstellen.
  •   
  • Der Aufruf setsid () wird verwendet, um den Prozess vom übergeordneten (normalerweise einer Shell) zu trennen.
  •   
  • Die Dateimaske sollte zurückgesetzt werden.
  •   
  • Das aktuelle Verzeichnis sollte in etwas Gutartiges geändert werden.
  •   
  • Die Standarddateien (stdin, stdout und stderr) müssen erneut geöffnet werden.
  •   

Wenn Sie einen dieser Schritte nicht ausführen, führt dies zu einem Daemon-Prozess, der sich falsch verhalten kann. Die typischen Symptome sind wie folgt.

     
  • Wenn der Daemon gestartet und dann abgemeldet wird, hängt das Terminal. Dies ist besonders unangenehm mit ssh.
  •   
  • Das Verzeichnis, aus dem der Daemon gestartet wurde, bleibt gesperrt.
  •   
  • Falsche Ausgabe erscheint in der Shell, von der der Daemon gestartet wurde.
  •   
    
bstpierre 04.08.2010 15:48
quelle
1

Dafür gibt es in glibc eine spezielle Funktion:

%Vor%

Weitere Details hier Ссылка

    
yanychar 27.04.2013 12:53
quelle

Tags und Links