2011-10-02 103 views
0

当我使用fork创建一个新的子进程,然后调用execlp syscall在子进程中运行一个新程序。在execlp之后,我在子进程中获得的进程ID和子进程终止后从waitpid系统调用中获得的进程id不同。fork和execlp

例如,getpid()在child中返回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

不知道你在做什么。 –

+0

帖子相关代码 – jman

+0

echo_cli中的pid和waitpid返回的pid不同 – Rambo

回答

4

你执行xterm,不echo_cli。你的孩子的孩子当然会报告一个不同的PID。

+1

那么我怎么才能在echo_cli中获得正确的pid?谢谢。 – Rambo

+0

直接执行'echo_cli'而不是要求'xterm'来执行。 –

+0

那么,这个任务说我需要用xterm来弹出一个x-window。 – Rambo