【问题标题】:fork and execlp分叉和执行
【发布时间】: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不同

标签: linux fork


【解决方案1】:

您正在执行xterm,而不是echo_cli。您孩子的孩子当然会报告不同的 PID。

【讨论】:

  • 直接执行echo_cli,而不是要求xterm这样做。
  • 嗯,作业说我需要使用 xterm 来弹出一个 x 窗口。
  • 那你不能直接知道echo_cli的PID。
  • 我明白了。也许我可以通过 execlp 中的 pid 来解决这个问题。还是谢谢。
猜你喜欢
  • 2011-07-09
  • 2017-01-28
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
相关资源
最近更新 更多