C语言 确定通过 fork()/execl() 运行的进程的结果



我有这个代码

# include <stdio.h> 
# include <unistd.h> 
# include <sys/wait.h> 
# include <stdlib.h> 
# include <string.h> 
# include <assert.h>
int parse( char * arg)
{ 
    int t; 
    t = fork(); 
    if (t < 0)
        return -1; 
    if (t == 0)
    {
        execl("/bin/sh", "sh", "-c", arg,NULL); 
        exit(1);
    } 
    return t; 
} 
int main(int argc, char *argv[])
{
    int t, tt, status, i;
    i = 1;
    for (i=1; i < argc; i++)
    {
        t = parse(argv[i]); 
        tt = wait(&status); 
        assert(tt == t);
    }
    return 0; 
}

可以运行一个或多个命令。

如果给定的命令之一失败,我正在尝试使其停止。

实际上,即使一个命令失败,它也会继续运行

./test 'ech foo' 'echo too'
sh: 1: ech: not found
too

我确实尝试了多种解决方案,wait()waitpid()但仍然不起作用。

当 shell 无法执行程序时,子进程的退出状态将不为零。可以通过计算从wait()调用返回的status变量进行检查。

这不是那么简单,因为wait()将更多信息打包到status中,而不仅仅是退出代码。此外,可用信息也会根据WIFCONTINUEDWIFEXITED、....

如果我们对孩子通过正常路径成功退出的事实感兴趣,我们可以使用:

int
main(int argc, char *argv[])
{
    int t, tt, status, i;
    i = 1;
    for (i=1; i < argc; i++)
    {
        t = parse(argv[i]); 
        tt = wait(&status);
        assert(tt == t);
        if ((! WIFEXITED(status)) || (WEXITSTATUS(status) != 0)) {
            fprintf(stderr, "Command '%s' failed, aborting...", argv[i]));
            return 1;
        }
    }
    return 0; 
}

相关内容

  • 没有找到相关文章

最新更新