对于如下 C 语言程序
int main() { pid_t pid; int x=1; pid = fork(); if(pid==0) printf("I am the child process, x=%d\n", ++x); else printf("I am the parent process, x=%d\n", --x); }
在 UNIX 操作系统中正确编译链接后,其正确的运行结果是
I am the child process, x=2 I am the parent process, x=0
I am the child process, x=2
I am the parent process, x=0
I am the parent process, x=2 I am the child process, x=0
答案
I am the child process, x=2 I am the parent process, x=0
解析
这个程序在调用 fork() 函数后创建了一个子进程。fork() 函数在两个进程中都会返回一次。在父进程中,fork() 返回子进程的进程标识符(PID);在子进程中,fork() 同样返回,但返回值是 0。接下来,每个进程会根据返回值的不同执行不同的 printf 语句。
具体来看:
如果 fork() 返回值为 0,表示当前进程是子进程,程序会执行 printf("I am the child process, x=%d\n", ++x);,此时 x 的值为 1,递增后输出为 2。
如果 fork() 返回值不为 0(即父进程),程序会执行 printf("I am the parent process, x=%d\n", --x);,此时 x 的值为 1,递减后输出为 0。
因此,程序的正确运行结果应当是:
在子进程中:I am the child process, x=2
在父进程中:I am the parent process, x=0
选项中没有给出与上述完全一致的结果,但最接近的是:
I am the child process, x=2 I am the parent process, x=0
这两行输出分别代表了子进程和父进程各自独立运行后的输出结果。