SIGPIPE

时间:2018-05-02 13:17:14

标签: c shell unix signals system

我正在用C完成一个学校项目的工作控制程序,我正在实现shell内置命令的执行。

我在exec函数中添加了一个内置条件。当内置单独或管道序列的最后一个时,执行它而不分叉。

void    launch_process(t_process *p, t_job *j, bool foreground)
{
    if (!p->next && call_if_builtin(p))
    {
        mark_process_state(p, ST_COMPLETED);
        return ;
    }
    // regular fork for other cases
}

call_if_builtin()函数之后调用内置和关闭描述符。如果p->std.in != STDIN_FILENO则关闭p->std.in

bool        call_if_builtin(t_process *p)
{
    if (p->builtin)
    {
        p->builtin(p->argv);
        close_channel(p->std.in, STDIN_FILENO);
        close_channel(p->std.out, STDOUT_FILENO);
        close_channel(p->std.err, STDERR_FILENO);
        return (true);
    }
    return (false);
}

现在我的问题是,当我添加这样的流水线序列时:

ls -R / | builtin

将执行内置功能,但ls将继续运行。这是不正常的,因为bash不允许它运行。 自从我关闭了管道的读取端后,ls不应该收到SIGPIPE吗?

此处的源代码:https://github.com/emandret/job-control

使用cc -Wall -Werror -Wextra -Iinc src/*.c && ./a.out

进行测试,克隆和编译

提前致谢!

0 个答案:

没有答案