Как игнорировать пустые каналы в процессе 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 позволить компилятору просто игнорировать пустые каналы?

1 ответ

Решение

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

signal(SIGPIPE, SIG_IGN);

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

Другие вопросы по тегам