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

使用[straceの(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 FIFOのもう一方の端のプログラム)をデバッグするstrace(1)を使用する必要があります。エラーの場合はperror(3)に電話してください。

おそらくunix(7)ソケットを使用すると、あなたのケースではより関連性があります。それでpoll(2)の前にaccept(2)

あなたはAdvanced Linux Programmingを読むべきです。ここで

+0

FIFOを作成して何か書き込んだら、Basileに感謝します。それから、別のプロセスからこの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(); 
} 
関連する問題