popen() alternative
Meine Frage ist Erweiterung dieses: popen erzeugt eine zusätzliche sh-Prozess
Motive:
1) Mein Programm erstellen müssen, ein Kind, das keine tail
auf eine Datei. Ich brauche zu wird der output Zeile für Zeile. Das ist, warum ich bin mit popen
denn es gibt in der DATEI *. Kann ich mir einfach Holen einzige Linie, tun, was ich tun müssen, und drucken Sie es.
Ein problem mit popen ist, dass Sie nicht bekommen pid des Kindes (tail-Befehl in meinem Fall).
2) Mein Programm soll nicht beendet werden, bevor Ihr Kind getan wird. Also ich muss wait
; aber ohne pid, ich kann es nicht tun.
Wie kann ich erreichen, beide Ziele haben Sie?
Möglich (Unordnung) Lösung: tun execvp("tail-f Datei > tmpfile") und das Lesen zu halten, dass tmpfile. Ich bin mir nicht sicher wie gut diese Lösung ist, aber.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum bist du nicht mit pipe/fork/exec-Methode?
close(pipefd[0])
nachdem ich fertig bin, Lesen am Ende? oder direkt vorkill
?pipe
Funktion derexec*
Familie undfdopen
. Dies ist nicht standard, aber so istpopen
.wait
. Lesen Sie einfach das Rohr bis zuEOF
.execvp("tail -f file > tmpfile")
wird nicht funktionieren, Umleitung ist ein feature der shell, und Sie sind nicht auf die shell ausführen hier. Selbst wenn es funktionierte, es wäre eine schreckliche Lösung. Angenommen, Sie haben zu Lesen, um das Ende der Datei, aber der Kind-Prozess noch nicht abgelaufen ist. Was tun Sie?Du kann Verwendung
wait
da Sie nicht wollen, eine PID zu warten, sondern wartet einfach, bis die alle untergeordneten Prozess zu beenden. Wenn Sie erstellt haben, anderen untergeordneten Prozesse zu verfolgen, und wennwait
gibt eine unbekannte PID können Sie davon ausgehen, es ist von Ihrempopen
Prozess.wait
stellen Sie sicher, dass das Kind auch getötet/beendet vor dem beenden des Hauptprogramms?kill(getpgrp(), SIGTERM);
töten alle Ihre Prozesse.Ich bin mir nicht sicher, warum Sie benötigen die Prozess-ID des Kindes. Wenn das Kind beendet, die pipe Lesen zurück ein EOF. Wenn Sie brauchen, um beenden Sie das Kind, gerade in der Nähe der Leitung.