2012-09-04 70 views
3

我正在寫入管道,直到用戶輸入字符串「end」。如果用戶輸入字符串「結束」,我想走得更遠。在這裏,我必須關閉管道並打印「寫入管道後」消息。但它沒有打印「寫入管道後」行,即使我輸入了「結束」字符串。 ?我怎樣才能關閉管,並進一步去偶雖然沒有進程讀取管道..如何寫入命名管道,不要等待讀取管道

你好,這裏是我的代碼,

int main() { 
int fd; 
char *b, *c; 
printf("Enter Str : "); 
b = malloc(50); 
gets(b); 

while(strcmp(b,"end")!=0){ 
    if(access("MSG",F_OK) != -1) // check pipe is already available. 
    { 
     fd = open("MSG", O_WRONLY); 
     write(fd, b, strlen(b)); 
    } 
    else 
    { 
     if(mkfifo("MSG", 0666) != -1) // create pipe if not available. 
     { 
      fd = open("MSG", O_WRONLY); 
      write(fd, b, strlen(b));    
     } 
    } 
    printf("Enter Str : "); 
    gets(b); 
} 
close(fd); 
printf("After Written to Pipe"); 

} 
+0

那裏有一大塊(不必要的)代碼重複。你可以使用if(access(「MSG」,F_OK)!= 0){if(mkfifo(「MSG」,0666)!= 0)...報告錯誤並停止...}然後有一個副本'open()'和'write()'。您應該考慮如果FIFO創建失敗會發生什麼情況。你應該考慮如果open()失敗會發生什麼。你可能考慮檢查'write()'的返回值。除非成功地打開'fd',否則不應該調用'close()'(但是close應該在open循環中;你正在泄漏文件描述符)。你確定要打開循環中的FIFO嗎? –

回答

0

mkfifo(3)手冊頁:

但是,它必須在兩端同時打開,然後才能繼續對其執行任何輸入或輸出操作。打開一個FIFO用於正常讀取塊,直到某個其他進程打開相同的FIFO進行寫入,反之亦然。

上述段落意味着write將阻塞,直到有人從FIFO讀取,這是您在程序中看到的內容。

+1

是否有任何其他功能/選項可以克服這些阻塞? – user1216216

1

命名管道並非此處的正確工具,因爲bash無法在非阻塞模式下使用它們。

可能使用編程語言編寫工具,其行爲類似於cat,但不會阻塞。但none of the results I found讓我很開心,推薦他們給你。

否則它要麼插槽(使用netcatlocalhost),不幸的是不安全的,因爲你的計算機上的所有其他用戶可以訪問它們太...

或者某種正常的文件,它充當緩衝器。但是在那裏你會遇到如何刪除已經閱讀過的文字,這樣就不會出現洪水,競賽狀況和所有惡夢。

對不起,但這裏真的沒有一個好的解決方案。要正確解決這個問題,需要修補bash和cat來添加一個選項以允許非阻塞行爲。