2012-02-05 5 views
11

Tworzę procesy podrzędne w for-loop. W procesie potomnym mogę pobrać PID dla dziecka z getpid().Jak uzyskać PID dziecka w C?

Jednak z jakiegoś powodu, gdy próbuję zapisać wartość getpid() do zmiennej zadeklarowanej przez proces macierzysty, zmiana jest anulowana, gdy sprawdzam go w procesie macierzystym. Zakładam, że ma to do czynienia z jakimś zakresem zmiennej procesowej. Nie bardzo znany z C, więc nie może być zbyt pewny.

W jaki sposób można zapisać wynik getpid() potomka PID (po wywołaniu z procesu potomnego) do zmiennej w procesie nadrzędnym?

A może innym podejściem jest przechowywanie fork() w zmiennej w rodzicu i wywoływanie jakiejś funkcji na tej zmiennej w celu pobrania PID dziecka? Nie wiem, jak to zrobić, więc jeśli to jest lepszy sposób, jak by to zrobić?

+0

Wow Czuję się/jestem jak idiota, thx za szybkie odpowiedzi !!!! – Derek

+0

@Johnsyweb Są to oczywiście 2 zdania. 's/i wewnątrz procesu potomnego /. Wewnątrz tych procesów potomnych/'. – glglgl

+0

@glglgl: Aha. Jestem idiotą. Edytowano pytanie do uczynienia go bardziej zrozumiałym dla ludzi takich jak ja :) – Johnsyweb

Odpowiedz

24

fork już zwraca pid dziecka. Po prostu zapisz wartość zwracaną.

spojrzenie na człowieka 2 widelcu:

RETURN WARTOŚCI

Upon successful completion, fork() returns a value of 0 to the child process and 
returns the process ID of the child process to the parent process. Otherwise, a 
value of -1 is returned to the parent process, no child process is created, and 
the global variable errno is set to indicate the error. 
-4

Istnieją dwie główne funkcje, aby uzyskać identyfikator procesu procesu rodzicem a dzieckiem. getpid()() i getppid

+2

-1 'getpid()' zwraca PID procesu wywołującego, nie jest to dziecko (dzieci) – Celeritas

1

Jak wspomniano w poprzedniej odpowiedzi że „widelec() zwraca wartość 0 do procesu dzieci i zwraca identyfikator procesu proces potomny procesu macierzystego”. Więc, kod może być napisany w ten sposób:

pid = fork(); /* call fork() from parent process*/ 
if (0 == pid) 
{ 
    /* fork returned 0. This part will be executed by child process*/ 
    /* getpid() will give child process id here */ 
} 
else 
{ 
    /* fork returned child pid which is non zero. This part will be executed by parent process*/ 
    /* getpid() will give parent process id here */ 
} 

Ten link jest bardzo pomocny i wyjaśnia w szczegółach.

0

Jeśli dzwonisz widelec w następujący sposób:

pid = fork() 

Następnie PID jest w rzeczywistości dziecko PID. Możesz go wydrukować od rodzica.