我正在用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
提前致谢!