当我使用fork创建一个新的子进程然后调用execlp syscall来在子进程中运行一个新程序时。我在execlp之后进入子进程的进程ID以及在子进程终止后从waitpid系统调用获得的进程ID是不同的。
例如,getpid()在子节点中返回7103,而waitpid在父节点中返回7101。
我想在execlp运行后会发生一些事情。谁能解释一下呢。感谢。
顺便说一下,我在Fedora上运行我的代码。
以下是代码:
/ *程序父级* /
if ((pid = fork()) < 0){
perror("fork failed");
exit(2);
}
if (pid == 0){
// child
execlp("xterm", "xterm", "-e", "./echo_cli", "127.0.0.1", (char *)0);
exit(0);
}
/* ... */
// sig_chld handles SIGCHLD singal
void sig_chld(int signo){
pid_t pid;
int stat;
while ((pid = waitpid(-1, &stat, WNOHANG)) > 0){
printf("Child %d terminated\n", pid);
}
return ;
}
/ *程序echo_cli * /
pid = getpid();
答案 0 :(得分:4)
您正在执行xterm
,而不是echo_cli
。您孩子的孩子当然会报告不同的PID。