Проблема управления заданиями с SIGPIPE - PullRequest
0 голосов
/ 02 мая 2018

Я заканчиваю программу управления заданиями на 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

Заранее спасибо!

...