Immer die PID von popen
Ich habe ein Programm, das mit popen()
um Sie zu öffnen und Lesen Sie die Ausgabe aus einer shell-Befehl. Das problem ist, soweit ich das beurteilen kann, gibt es keinen einfachen Weg, um die PID des Laufenden Prozesses, und daher können Sie nicht töten, wenn es klemmt. Die Frage ist also, wie können Sie abrufen, die PID von einem Prozess geöffnet mit popen
?
- Sind Sie wollen die PID des
/bin/sh
Prozess, wird hervorgebracht, oder einer der eventuell mehreren anderen Prozessen, die erzeugt werden als Ergebnis von was auch immer Befehlszeile übergeben wird, um/bin/sh
? Im Allgemeinen Fall, es ist nicht unbedingt nur ein PID hier, das ist wahrscheinlich zumindest ein Teil der Grund ist es nicht ohne weiteres verfügbar... - Ja,
/bin/sh
sollte ausreichen - ich wollte nur etwas-nichts -, die mir erlauben würde, zu töten Prozesse wie iperf-server-Modus. - warum nutzen Sie nicht system("killall -9 iperf")? und was ist der Nachteil bei diesem? Grüße, ugesh
killall -9 iperf
würde alle töten iperf-Prozesse system-weit, auch wenn es nichts zu tun hat mit meinem speziellen Anwendung. Plus, es ist nicht nur iperf, die ich brauche, um zu töten, sondern auch Befehle wieping
odercurl
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Lösung kam ich mit (und der Konsens) ist das erstellen eines neuen
popen
Funktion, die mir erlaubt, abrufen der PID. Da war ich nicht in der Lage zu finden, ein einfaches Beispiel SO, ich wollte nach meiner Umsetzung in der Hoffnung, dass es hilft jemand anderes. Feedback und Alternative Lösungen sind willkommen.FILE*
mithilfefdopen
popen
zurückFILE *
als gut. Ich aktualisierte mein code.pclose2
tun, diewaitpid
und diefclose
pclose()
ist in der Lage, zum abrufen der pid desFILE *
zur Verfügung gestellt.popen
in einigen freie-software-libc z.B. popen.c von musl-libc13446 root 928 S /bin/sh -c ping 8.8.8.8
13447 root 924 S ping 8.8.8.8
und wenn töten aufgerufen wird, in der test-code:13446 root 0 Z [sh]
13447 root 924 S ping 8.8.8.8
- und while-Schleife nie beendet, aber es liest ping-Antwort die ganze Zeit/bin/sh
als gut.popen.c
es sieht aus wie die pids gespeichert werden in einem statischen array, die ist unzugänglich, außerhalb derpopen.c
setpgid(child_pid, child_pid);
zu popen2 (siehe oben), so dass der erzeugte Prozess hat seine eigene Gruppen-id.pid
im C-Programm wurde von der anderen wieder durch den terminal-Befehlpgrep
suchen und am Ausgang desps -aux | grep myNameProc
es schien den Prozess der das C-Programm wurde die Gabel einmal mehr seitexecl("/bin/sh", "/bin/sh", "-c", command.c_str(), NULL);
ist eigentlich die Schaffung eines anderen Prozesses, der nicht/bin/sh cmd string
. Ich löste Sie Folgendes tun:execl(command.c_str(), command.c_str(), (char*)NULL);
/bin/sh -c
können Sie einen Befehl mit Argumenten.exit()
nach einem gescheitertenexec()
rufen Sie in einem Kind-Prozess ist eine schlechte Idee. Das wird bündig alle gepufferten Daten kopiert vom übergeordneten Prozess zum übergeordneten Prozess Bäche und rufen alle exit-Handler, dass der parent-Prozess registriert. In einem C++ Prozess, es wird auch dazu führen, statische Destruktoren ausgeführt. Der Aufrufexit()
sollte ersetzt werden, mit_exit()
.exit()
wegen der Gabel scheitern müssen ersetzt werden als gut, oder bedeutet die Tatsache, dass die Gabel versagt, bedeutet, dass die Eltern war Speicher nicht kopiert werden, das Kind (einschließlich atexit-Handler)?KLÄRUNG
Ich habe versucht, die definierten Funktionen von @Gillespie ' s Antwort, fand aber heraus, dass die
pid
in der C/C++ Programm wurde von der anderen wieder durch den terminal-Befehlpgrep
suchen und am Ausgang desps -aux | grep myNameProc
es schien den Prozess der das C-Programm wurde die Gabel einmal mehr.Denke ich, weil
execl("/bin/sh", "/bin/sh", "-c", command.c_str(), NULL);
ist eigentlich äquivalent zu/bin/sh cmd string
. Also im Grunde wird der Kind-Prozess der C (oder C++) - Programm ist das erstellen eines neuen Prozess, der nicht/bin/sh yourRealProcess
woyourRealProcess
ist, das angegeben wird das diecommand
string.Löste ich wie folgt:
execl(command.c_str(), command.c_str(), (char*)NULL);
. Jedoch, wie angegeben durch @Gillespie in der vorherigen Kommentare, die in diese Weise werden Sie nicht in der Lage sein, Argumente übergeben an Ihren Prozess.C-IMPLEMENTIERUNG
Nach meinen Bedürfnissen ich readapted @Gillespie Funktionen umfassen die oben diskutierten änderung und zur Arbeit in die C-Programmierung Sprache: