2016-12-19 6 views
1

Я пытаюсь использовать FIFO для межпроцессорной обработки. Но при попытке создать FIFO и затем открыть его, моя программа зависает (не может выйти).Программа с mkfifo() и open() не может выйти

if (mkfifo("./fifo.txt", S_IRUSR | S_IWUSE) < 0) { 
    fprint("Can not create fifo"); 
    return 1; 
} 
if ((readfd = open("./fifo.txt", O_RDONLY)) < 0) { 
    return 1; 
} 

Что я здесь делаю неправильно?

спасибо.

+0

Используйте [Трассирование (1)] (http://man7.org/linux/man-pages/man1/strace.1.html) в вашей программе. И вызовите [perror (3)] (http://man7.org/linux/man-pages/man3/perror.3.html) при ошибке. –

+1

«Открытие FIFO для чтения обычно блокирует, пока какой-либо другой процесс не откроет тот же FIFO для записи, и наоборот». https://linux.die.net/man/3/mkfifo – maxik

ответ

2

Читать fifo(7), а именно:

Обычно, открывая блоки FIFO, пока другой конец не будет открыта также.

Поэтому я предполагаю, что ваш звонок в open(2) заблокирован. Возможно, вы хотите передать флаг O_NONBLOCK.

Вы должны использовать strace(1) для отладки программы (и, возможно, также straceдругой программы на другом конце ФИФО). И позвоните по телефону perror(3).

Возможно использование unix(7) разъемов может быть более актуальным в вашем случае. Вы можете затем poll(2) до accept(2)

Вы должны прочитать Advanced Linux Programming.

+0

Спасибо, Базиль, после создания FIFO и написания чего-то к нему. Затем я попытался прочитать этот FIFO из другого процесса, и он работает (я имею в виду, он может выйти) –

0

Вот пример кода:

#include <unistd.h> 
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

void child(void) 
{ 
    int fd = 0; 
    if ((fd = open("./fifo.txt", O_WRONLY)) < 0) { 
     return; 
    } 

    write(fd, "hello world!", 12); 
} 

void parent(void) 
{ 
    int fd = 0; 
    if ((fd = open("./fifo.txt", O_RDONLY)) < 0) { 
     return; 
    } 

    char buf[36] = {0}; 
    read(fd, buf, 36); 
    printf("%s\n", buf); 
} 


int main(void) 
{ 
    pid_t pid = 0; 

    if (mkfifo("./fifo.txt", S_IRUSR | S_IWUSR) < 0) { 
     printf("Can not create fifo\n"); 
     return 1; 
    } 

    pid = fork(); 
    if (pid == 0) { 
     printf("child process\n"); 
     child(); 
    } else if (pid < 0) { 
     printf("fork error\n"); 
     return -1; 
    } 

    parent(); 
}