【发布时间】:2011-10-02 06:38:49
【问题描述】:
当我使用 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();
【问题讨论】:
-
不知道自己在做什么。
-
echo_cli中的pid和waitpid返回的pid不同