2016-12-19 64 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(1)調試程序(也許還有strace對FIFO的另一端其他程序)。如果有錯誤,請致電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(); 
}