2017-07-10 1 views
0

Betrachten Sie dieses einfache Programm zu verstehen:Der Versuch, die Logik der Funktion fork Rückgabewert

using namespace std; 

int main(int argc, const char * argv[]) { 
    cout << "first pid: " << getpid() << endl; 
    int a = fork(); 
    int b = fork(); 
    cout << a << " " << b << endl; 
    return 0; 
} 

Also ich bin mit diesem über und über, und zu versuchen, zu verstehen, was das Muster, das in jedem Durchlauf auftreten wird. Ich verstehe einfach nicht, was in Bezug auf die Zahlen passiert. Ich drucke ursprünglich das Pid vor den Gabeln, und dann sehe ich das Pid nicht mehr, als wäre es verändert oder so. Ich füge 2 verschiedene Ausgänge als Referenz:

first pid: 64538 
64541 64542 
64541 0 
0 64543 
0 0 

first pid: 64625 
64628 64629 
0 64630 
0 0 
64628 0 

Was verstehe ich, dass es jetzt vier Prozesse am Leben sind, da die ersten Gabel Ergebnisse mit 2 Prozessen und der zweiten Gabel Gabeln sie in 4 proccesses zusammen. Was ich nicht verstehe, ist die Logik der auf der Konsole gedruckten IDs.

+0

Da Kindprozesse werden sie in zufälliger Reihenfolge nicht synchronisiert drucken. – VTT

+0

IDs werden vom Betriebssystem aufgrund seiner eigenen intrinsischen "Logik" zugewiesen. Eine ID muss (nach Betriebssystem) vergeben werden, um eindeutig zu sein, aber nichts anderes (akzeptieren Sie, dass es einen speziellen No-PID-Wert geben sollte). – Scheff

+0

64541 in der ersten Ausgabe und 64628 in der zweiten erscheinen zwei Mal. PIDs auf einem Unix-System werden üblicherweise in aufsteigender Reihenfolge zugewiesen. –

Antwort

0

Ich habe Kommentare zum OP zu beschreiben, was passiert: ist eine Tabelle von hier

using namespace std; 

int main(int argc, const char * argv[]) { 
    cout << "first pid: " << getpid() << endl; 
    int a = fork(); 
    // from here two processes run: 
    // in parent a is PID of child 
    // in child a is 0 
    int b = fork(); 
    // from here four processes run: 
    // a is for parent and child identical 0 or PID 
    // in parents b is PID of child 
    // in children b is 0 
    // Thus, the following shows all 4 combinations of 0 and not 0. 
    cout << a << " " << b << endl; 
    return 0; 
} 
0

Die ‚Logik‘ ist, dass die Null bedeutet, dass Sie das Kind des fork() sind, -1 einen Fehler bedeutet, und jede positive Zahl ist die PID des Kindes und dass Sie die Eltern.

Es gibt keine spezifizierte 'Logik', wie PIDs zugewiesen werden. Such nicht nach irgendwelchen.

+0

Es gibt jedoch ein Muster, in jedem Lauf gibt es einen Prozess, der 2 Zahlen druckt, die nicht 0 sind, und der Rest druckt 1 oder 2 Nullen. Was ist die Erklärung dafür? – Eyzuky

2

, was los ist:

gen_0  | gen_1   | gen_2_0  | gen_2_1 
      |    |    | 
==[ before first fork ]================================== 
started |    |    | 
pid = 123 |    |    | 
      |    |    | 
--[ after first fork ]=================================== 
      | started  |    | 
      | pid = 1111 |    | 
      | parent: gen_0 |    | 
a = 1111 | a = 0   |    | 
      |    |    | 
--[ after second fork ]================================== 
      |    | started  | started 
      |    | pid = 2222 | pid = 3333 
      |    | parent: gen_0 | parent: gen_1 
a = 1111 | a = 0   | a = 1111  | a = 0 
b = 2222 | b = 3333  | b = 0   | b = 0 
Verwandte Themen