我的作业是这样问的:
使用下面的程序,确定 A、B、C、D 行的 pid 值。(假设父子的实际 pid 分别为 10 和 20。)为每一行解释 pid 的原因价值。
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t pid, pid1;
/* fork a child process */
pid = fork();
if (pid < 0) { /* error occurred */
fprintf(stderr, "Fork Failed\n");
return 1;
}
else if (pid == 0) { /* child process */
pid1 = getpid();
printf("child: pid = %d\n",pid); /* A */
printf("child: pid1 = %d\n",pid1); /* B */
}
else { /* parent process */
pid1 = getpid();
printf("parent: pid = %d\n",pid); /* C */
printf("parent: pid1 = %d\n",pid1); /* D */
wait(NULL);
}
return 0;
}
当我运行它时,我得到(例如):
parent: pid = 1586
parent: pid1 = 1585
child: pid = 0
child: pid1 = 1586
为什么
fork()
和 getpid()
为所谓的相同进程返回不同的 pid?
你应该首先了解这两个函数的返回值:
fork
在子进程中返回0,在父进程中返回非零值;这个非零值是子进程的 PID。getpid
返回当前进程的PID; current 表示调用 getpid
函数的任何人。首先,在您的代码中,即使
pid1 = getpid()
行相同,caller 也不同。在 else if
块中它是子进程,而在 else
块中它是父进程。因此这两个pid1
在输出中是不同的。
其次,在父进程中,
pid
(fork
的返回值)是子进程的PID,不是自己的。 fork
返回子进程的 PID 的原因是为了让父进程与子进程进行通信和控制。