根据手册页
getpid()返回调用进程的进程ID(PID)。
parent pid
返回的值与getpid()
不同? #include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char const *argv[])
{
printf("getpid = %d \n", (int)getpid());
pid_t pid = fork();
printf("fork returned %d \n", (int)pid);
switch (pid)
{
case -1:
perror("fork failed");
break;
case 0:
printf("I am a child with pid = %d\n", (int)pid);
break;
default:
printf("I am a parent with pid = %d\n", (int)pid);
break;
}
return 0;
}
我运行时输出:
getpid = 8208
fork returned 8209
I am a parent with pid = 8209
fork returned 0
I am a child with pid = 0
在另一台PC上运行时的输出:
getpid = 2522
fork returned 2523
I am a parent with pid = 2522
fork returned 0
I am a child with pid = 2523
答案 0 :(得分:2)
是的,父进程和主进程是同一件事。
此代码段应为您提供有关解决方案的线索:
switch (pid) {
/* ... */
case 0:
printf("I am a child with pid = %d\n", (int)pid);
break;
这实际上表示“如果pid
为零,则子pid始终为零”。这显然是不正确的,因此您对fork()
返回值的解释是错误的。
该手册页指出:
成功完成后,fork()向子进程返回值0,并将子进程的进程ID返回给父进程。
因此,父进程中的变量pid
是子进程的pid,不父进程自身的pid。< / p>
在子进程中,您需要在getpid()
之后调用fork()
才能获得孩子自己的pid。
答案 1 :(得分:1)
fork
复制了一个进程,并且在派生之后,它们都并行运行。为了告诉程序是子进程还是父进程,它会为子进程返回0,并在父进程中返回子进程的PID。
因此,在派生之后,必须在您的代码中为父母和孩子都调用getpid()
,
pid_t thispid= getpid();
switch (pid)
{
case -1:
perror("fork failed");
break;
case 0:
printf("I am a child with pid = %d\n", (int)thispid);
break;
default:
printf("I am a parent with pid = %d\n", (int)thispid);
break;
}