Я заканчиваю программу управления заданиями на C для школьного проекта и внедряю в нее выполнение встроенных команд оболочки.
Я добавил в функцию 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
Заранее спасибо!