我已經C代碼下列位,它從管道讀取信息,然後應該阻止,但它從未塊讀不阻塞命名管道
int pipe_fd;
int res;
int open_mode = O_RDONLY;
char buf[100];
int bytes_read = 0;
memset (buf, '\0', sizeof(buf));
pipe_fd = open(FIFO_NAME, open_mode);
if (access(FIFO_NAME, F_OK) == -1)
{
res = mkfifo(FIFO_NAME, 0777);
if (res != 0)
{
fprintf (stderr, "Could not create fifo %s\n", FIFO_NAME);
exit (EXIT_FAILURE);
}
}
for(;;)
{
do
{
res = read(pipe_fd, buf, sizeof(buf));
bytes_read += res;
}while (res > 0);
// process data then go back and block
............
}
這是由某些代碼在一個bash腳本發送簡單的緩衝像這樣的」 ./test 1'
#!/bin/bash
pipe=/tmp/pipe
if [[ ! -p $pipe ]]; then
echo "Reader not running"
exit 1
fi
if [[ "$1" ]]; then
echo "some string" >$pipe
else
echo "q" >$pipe
fi
我運行在GDB的C代碼程序,最初它在讀取的塊,但只要我叫bash腳本的C代碼不再塊,它確實成功從 讀取緩衝區中的數據,然後每次讀取時都有0個字節讀取所以不知道爲什麼它不再阻塞。 '一些字符串'的數據在另一端正確接收。
我只需要坐在那裏等待數據處理,然後回去等待更多
非常感謝,沒有意識到。在重新開放之前,我應該在收到EOF之後關閉fifo – tech74 2010-08-12 11:35:59
@ tech74:顯然。 'open()'分配新的文件描述符 - 舊的必須使用'close()'釋放。作家將阻止,直到您重新打開FIFO再次讀取。 – Dummy00001 2010-08-12 12:03:45
+1鏈接! – 2012-11-05 11:31:36