2011-06-06 204 views
0

我試圖使用命名管道。我有一個讀取info和另一個將信息寫入管道的進程。命名管道創建

這是我的讀者進程的降低代碼:

main (int argc, char *argv[]) { 
    int fd, mkn; 
    char message[100]; 

    if(unlink("aPipe") == -1) { 
     perror("Error unlinking:"); 
    } 


    if((mkn = mknod("aPipe", S_IFIFO, 0)) < 0){ 
    perror("Error mknod:"); 
    } 

    if(chmod("aPipe", 0660)) { 
    perror("Error chmod:"); 
    } 

    if(fd = open("aPipe", O_RDONLY) < 0) { 
    perror("Error abriendo el PIPE"); 
    } 

    printf("going to read..\n"); 

close(fd); 
} 

,但卡在該行:if(fd = open("aPipe", O_RDONLY) < 0),直到永遠,我真的不明白爲什麼。

如果你知道男人頁說,它這裏發生了什麼,請告訴我:)

+0

哪個進程負責創建FIFO:讀取器還是寫入器(或者應該在創建之前創建)?如果您的讀者刪除了由作者創建的FIFO,則它會因爲其新管道上沒有寫入器而被阻塞,相反,如果作者刪除由閱讀器創建的FIFO,由於沒有閱讀器,它將阻止打開。另外,你應該使用['mkfifo()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/mkfifo.html)而不是'mknod()'(儘管大約二十年前,你會使用'mknod()',因爲'mkfifo()'不存在)。 – 2011-06-06 04:20:37

回答

3

FIFO都有點陌生;作爲作家的open()會阻止,直到有讀者,反之亦然。更糟糕的是,就像一個真正的管道,當作家關閉它的結束時,讀取結束將永遠返回EOF;您必須關閉並重新打開(爲下一個閱讀器封鎖)。或者你需要一些方法來知道作者何時完成,例如只使用一行或帶有一個EOF數據包。

0

是否有任何進程寫入FIFO? 如果否,這是自從您在阻塞模式下打開FIFO RDONLY後的預期行爲,則當前進程將不會繼續,直到有一個進程實際寫入FIFO。

+0

是的,我有這個打開管道的過程:fd = open(「aPipe」,O_WRONLY | O_NDELAY);這個打開的函數是在while(fd == -1)時執行的;但是無論如何,它總是顯示錯誤:沒有這樣的設備或地址 – Lucy 2011-06-06 02:39:24

+0

一方必須通過O_CREAT來打開()以創建管。 – Nemo 2011-06-06 02:45:15

+0

不mknod創建管道? – Lucy 2011-06-06 02:46:44

2

下面是代碼:

讀者:

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

readline(int fd, char *str) { 
int n; 
do { 
    n = read(fd, str, 1); 
    if(n == -1){ 
     perror("Error reading:"); 
    } 
} 
while(n > 0 && (str++) != NULL); 

return(n > 0); 

}

main (int argc, char *argv[]) { 
int fd, mkn; 
char message[100]; 

if(unlink("aPipe") == -1) { 
    perror("Error unlinking:"); 
} 

if((mkn = mknod("aPipe", S_IFIFO, 0)) < 0){ 
    perror("Error mknod:"); 
} 

if(chmod("aPipe", 0660)) { 
    perror("Error chmod:"); 
} 

if(fd = open("aPipe", O_RDONLY) < 0) { 
    perror("Error abriendo el PIPE"); 
} 
printf("going to read..\n"); 
while(readline(fd,message)) 
    printf("%s\n", message); 
close(fd); 
} 

筆者:

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

main (int argc, char *argv[]) { 
int fd, messagelen,i; 
char message[100]; 

sprintf(message, "Hello from PID %d", getpid()); 

messagelen = strlen(message) + 1; 
do { 
    fd = open("aPipe", O_WRONLY|O_NDELAY); 
    if (fd == -1) { 
     perror("opening aPipe:"); 
     sleep(1); 
    } 
} 
while(fd == -1); 

for (i = 1; i < 4; i++) { 
    if(write(fd, message, messagelen) == -1) { 
     perror("Error writing:"); 
    } 
    sleep(3); 
} 
close(fd); 
} 

我要學習makefifo過,但之後我瞭解這個。

非常感謝您的寶貴幫助!

+0

如果你想添加一些東西,你應該編輯你的問題,而不是添加答案,除非你自己找到了解決方案,而你實際上正在回答自己的問題。 – falstro 2011-06-07 07:56:40