【问题标题】:How to take execlp's exit code如何获取 execlp 的退出代码
【发布时间】:2014-03-31 14:58:02
【问题描述】:

下面的代码是这样工作的:

我创建了一个管道来连接两个进程。一个进程将是命令 who,以便知道哪些用户已登录。另一个进程将是命令 grep,它获取 who 的命令输出并在此输出中查找“用户”。如果用户已登录,则主程序的退出代码必须为 1,如果用户未登录,则必须为 0。我必须在哪里获取退出代码?

代码如下:

int fd[2];
pipe(fd);

int pid1,pid2;
pid1 = fork();

if (pid1 != 0) {
    pid2 = fork();
    if(pid2 == 0) {
            close(0); dup(fd[0]); close(fd[0]), close(fd[1]);
            execlp("grep","grep ","user",NULL);
    } else {
            close(fd[0]); close(fd[1]);
    }
} else {
    close(1);
    dup(fd[1]);
    close(fd[0]);
    close(fd[1]);
    execlp("who","who",NULL);
}

【问题讨论】:

    标签: c linux pipe system-calls


    【解决方案1】:

    exec* 调用通常不会返回。如果他们返回,那只是因为exec 未能加载新的进程映像。在这种情况下,错误会在errno 中返回。

    如果您对子进程的退出状态感兴趣,那么您必须在父进程中为您的子进程安装SIGCHLDwait 的信号处理程序,并以这种方式检索退出状态。

    为了您自己的方便,您可以考虑改用system

    int exit_status = system("who | grep user");
    

    【讨论】:

      【解决方案2】:

      execlp() 用可执行命令覆盖地址空间并运行它。所以只有在执行命令时出现错误才会返回。在这种情况下,返回值为-1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 1970-01-01
        • 2020-12-16
        • 1970-01-01
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多