2016-08-23 3 views
1

Я написал простую пару программ для чтения-записи. Writer создает/открывает FIFO-файл и постоянно записывает в него строку. Читатель просто читает его и записывает на stdout. Читатель делает это только 10 раз, а затем завершает работу. Удивительно (для меня) писатель почти сразу же выходит. Он не просто выходит из пишущего цикла, он, кажется, выпрыгивает из него, я могу сказать это, не видя окончательного «bybyby» на экране. Я мог бы принять такое поведение, но я все еще не могу понять, почему. Разве кто-то может любезно поделиться со мной своими знаниями?Завершение чтения-процесса при закрытии FIFO-файла

/* writer code */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <sys/stat.h> 
#include <sys/types.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main() 
{ 
    char msg [] = "Leo_Tolstoy"; 

    size_t len = strlen("Leo_Tolstoy"); 

    if (mkfifo ("myfifo", 0600) != 0) { 
     perror ("creating fifo"); 
    } 
    int fd; 
    if ((fd = open ("myfifo", O_WRONLY)) == -1) { 
     perror ("opening fifo"); 
     exit (1); 
    } 
    while (1) 
    { 
     int r = write (fd, msg, len); 
     if (r == -1) 
      perror ("writing"); 
     sleep(1); 
    } 
    printf ("byebye\n"); 
    close (fd); 
    return 0; 
} 
/* reader code */ 
#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <sys/shm.h> 

int main() 
{ 
    char buf[50]; 

    printf ("bef opening\n"); 
    int fd = open ("myfifo", O_RDONLY); 
    if (fd == -1) { 
     perror ("opening fifo"); 
     exit (1); 
    } 

    printf ("bef reading\n"); 
    int cnt=0; 
    while (cnt < 10) 
    { 
     int r = read (fd, buf, 50); 
     if (r == 0) 
      break; 
     if (r == -1) 
      perror ("reading"); 
     write (1, buf, r); 
     cnt++; 
    } 
// close (fd); 
    return 0; 
} 
+1

Итак, C или C++. Я бы сказал, C, но это ваш звонок. Пожалуйста, выберите * один * язык, а не 2 (ваш вопрос, похоже, не относится к разным языкам). – Rakete1111

+2

Нет языка C/C++, но два ** разных ** языка C и C++. Выберите ** один ** из них. – Olaf

+0

Что говорит отладчик? – Olaf

ответ

2

При выходе (после 10 итераций), автор получает SIGPIPE из-за конца чтения были закрыты. Таким образом, выполняется действие по умолчанию для сигнала SIGPIPE, которое завершает программу. Вот почему вы не видите, что окончательный printf() не выполняется.

Вместо этого вы можете проигнорировать (SIG_IGN) сигнал SIGPIPE в письме, вызвав sigaction(), а затем самостоятельно обработать ошибку записи.

+0

Хорошо, теперь я указал обработчик сигнала для SIGPIPE, и все кажется Работа. Благодарю. –

Смежные вопросы