Как игнорировать пустые каналы в процессе CHILD?

Я использую подпрограмму с именем read_from_pipe в моем процессе child, как показано ниже, чтобы прочитать все, что находится в канале, и отобразить его:

void read_from_pipe(int fileDescriptr)
{
    FILE *stream;
    int c;
    if (fileDesc_Is_Valid(fileDescriptr) == TRUE)
    {
        stream = fdopen(fileDescriptr, "r");
        while ((c = fgetc(stream)) != EOF)
            putchar(c);                                     
        fclose(stream);
    }
    else                                                     
        perror("Reading from pipe failed -->");
}

fileDesc_Is_Valid — еще одна подпрограмма, проверяющая наличие файлового дескриптора.

Проблема в том, что, поскольку я использовал оператор waitpid(pid, &status, 0); в своем parent, чтобы дождаться, пока child завершит свои задачи, компилятор застревает в первом холодном запуске в цикле while, когда канал фактически пуст. Как я могу AND добавить еще одно условие в while, чтобы компилятор просто игнорировал пустые каналы?


person Bababarghi    schedule 14.10.2015    source источник
comment
Найдите SIGPIPE и руководства по обработке (или игнорированию) сигналов.   -  person Some programmer dude    schedule 14.10.2015
comment
@JoachimPileborg хммм ... Звучит сложнее, чем я думал изначально. Это единственный вариант, который у меня есть?   -  person Bababarghi    schedule 14.10.2015
comment
Нет, вы можете использовать signalfd() + poll() (или аналогичный)   -  person Valeri Atamaniouk    schedule 14.10.2015


Ответы (1)


На самом деле это очень просто, вам просто нужно игнорировать сигнал SIGPIPE, и это делается с помощью одного вызова функции:

signal(SIGPIPE, SIG_IGN);

Когда канал пуст, вместо подачи сигнала SIGPIPE чтение из канала вернет значение конца файла (основной системный вызов read вернет 0).

person Some programmer dude    schedule 14.10.2015
comment
@Bababarghi Просто добавьте строку в начале кода инициализации вашего приложения. - person Some programmer dude; 14.10.2015
comment
Всех надо кормить с ложечки? Буквально скопируйте и вставьте строку кода, которую он вам дал, бросьте ее вверху main() и оставайтесь в блаженном неведении. В противном случае вы можете больше узнать о сигналах и понять, как они влияют на вашу программу и как вы можете ими управлять. - person Jonathon Reinhart; 14.10.2015