如何使用execlp的退出代码

时间:2014-03-31 14:58:03

标签: c linux pipe system-calls

以下代码的工作方式如下:

我创建了一个连接两个进程的管道。一个进程将是命令who,以便知道哪些用户已登录。另一个进程是命令grep,它接受谁的命令输出并查找" user"进入这个输出。如果用户登录,主程序的退出代码必须为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);
}

2 个答案:

答案 0 :(得分:2)

exec*来电通常不会返回。如果他们返回,那只是因为exec无法加载新的过程映像。在这种情况下,错误将在errno中返回。

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

为方便您使用,您可能需要考虑使用system

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

答案 1 :(得分:0)

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