Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Kysymys prosesseista

Palvy [10.11.2012 18:56:48]

#

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;
}

Metabolix [10.11.2012 19:12:46]

#

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.

Palvy [10.11.2012 19:27:32]

#

Kiitos! Eipä tullut tuota ajatelleeksi vaikka olenhan tuosta joskus lukenut...

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta