Ao. koodi tulostelee esim. tällaista:
<parent> Next, do fork()
<parent> Me too!
ppid=2529, pid=3476, global=200, local=100
<child> I'm alive!
ppid=1, pid=3477, global=210, local=120
Tulosteen viimeinen rivi on selvästi lapsiprosessin tulostamaa, koska ainoastaan lapsiprosessi on muokannut muuttujien global ja local arvoja. Kysymys kuuluu: miksi lapsiprosessi saa getppid()-funktiosta paluuarvon 1 (vikalla rivillä tulosteessa ppid=1)? Eikös sen pitäisi saada tuo parent prosessin id eli 3476? Tässä on nyt varmaan jotain mitä en ymmärrä :)
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> /*! Global variable. */ int global = 200; int main(void) { int local = 100; pid_t pid; printf("<parent> Next, do fork()\n"); pid = fork(); if (pid == -1) { perror("<parent> Fork failed"); return -1; } if (pid == 0) { // Only child process would come here printf("<child> I'm alive!\n"); global += 10; local += 20; } else { // Only parent process would come here printf("<parent> Me too!\n"); } printf("ppid=%d, pid=%d, global=%d, local=%d\n",getppid(),getpid(),global,local); return 0; }
Tulosteestasi nähdään, että alkuperäinen prosessi jatkuu ensin ja sulkeutuu ennen lapsiprosessia, jolloin lapsiprosessi jää ilman vanhempaa ja siirtyy init-prosessin (id 1) alaisuuteen. Jos taas lapsiprosessi jatkuu ensin, se tulostaa odottamasi arvon. Saat molemmat toimintatavat helposti esiin lisäämällä sleep-rivin joko vanhemmalle tai lapselle.
Kiitos! Eipä tullut tuota ajatelleeksi vaikka olenhan tuosta joskus lukenut...
Aihe on jo aika vanha, joten et voi enää vastata siihen.