2009-10-06 4 views
17

Ich versuchte Google, aber getppid() gefunden, die die Eltern-PID des aktuellen Prozesses erhält.linux: programmatisch übergeordnete pid eines anderen Prozesses?

Ich brauche so etwas wie getppid(some_other_pid), gibt es so etwas? Im Wesentlichen nimmt die PID eines Prozesses und gibt den Elternprozess 'pid zurück.

+1

Werfen Sie einen Blick auf sysctl() Systemaufruf und diesen Link. http://www.objectpark.net/parentpid.html – vpram86

+1

@Aviator, warum kommentieren und keine Antwort? – hasen

Antwort

22

Ich denke, die einfachste Sache wäre, "/ proc" zu öffnen und den Inhalt zu analysieren.

Sie werden die ppid als 4. Parameter von/proc/pid/stat

+0

Nun, welcher Teil von '/ proc/ /' hält die Eltern-PID? – hasen

+5

Der 4 Parameter en/proc/pid/stat –

+0

Aha, super! Können Sie die Antwort bearbeiten, um das hinzuzufügen? – hasen

2

Sie können einen Blick auf sysctl() Systemaufruf und this Link.

+0

Probieren Sie es "blind-gefaltet", nicht sicher, warum es nicht ganz kompiliert. ist es nur für OS X? Soll es unter Linux funktionieren? – hasen

+0

Es funktioniert nur für BSD und OS X .. – vpram86

+0

sollten Sie einen freundlicheren Hyperlink erstellen. https://www.w3.org/QA/Tips/noClickHere – Jeff

10

oder von einem Unix-Shell Sie ps -p <child_pid> -o ppid=

+0

Ehrfürchtige einfache Antwort. Für einen Befehl können Sie kopieren/einfügen, um es in Aktion zu sehen. Try ** 'ps -p $$ -o ppid =' **. $$ ist die aktuelle Prozess-ID. – Jess

0

eine weitere Möglichkeit, es aus proc Eintrag zu erhalten versuchen:

cat /proc/<pid>/status | grep PPid: 
3

I am 7 Jahre spät, um die Partei, sondern für jeden, der auf diese stolpern Frage, hier ist eine alternative Lösung auf OS X. Andere hier gepostete Antworten sind korrekt und sysctl() wird den Job erledigen, aber Sie können auch proc_pidinfo verwenden, um viele nützliche Informationen über einen Prozess zu erhalten.

#include <libproc.h> 

int getppid(const pid_t pid) 
{ 
    proc_bsdinfo info; 
    proc_pidinfo(pid, PROC_PIDTBSDINFO, 0, &info, sizeof(info)); 
    return info.pbi_ppid; 
} 

Offensichtlich ist eine zusätzliche Fehlerprüfung erforderlich.