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.