在命名管道上读取不阻塞
我有一个C代码从管道读取,然后应该阻止,但它从不阻止
int pipe_fd; int res; int open_mode = O_RDONLY; char buf[100]; int bytes_read = 0; memset (buf,' ',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 %sn",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才能被读取或写入.当没有更多的作者(你的shell脚本被终止)时,通过read()返回EOF就会通知读者. FIFO的行为方式与shell管道逻辑兼容,例如: $mkfifo ./tmp1 $cat < input > ./tmp1 & $cat < ./tmp1 > /dev/null 如果read()不会返回EOF,则第二只猫会永久阻止.
在C程序中,read()返回EOF后,必须重新打开()FIFO. 附:找到quite nice FIFO summary为你的.检查第二页上的表格. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |