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