8
回答
有关命名管道通信。。。阻塞问题,请高手指点
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

我写了两个小程序,使用命名管道进行通信,看下面代码。

sever端

#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<stdio.h>
int main(void){
char FIFO[]="/root/myfifo";
char msg[8]="hello!\n";
char buf[8]={0};
int n ;
char stdo[35];
unlink(FIFO);
mkfifo(FIFO,0777);
while(1)
{

int fd=open(FIFO,O_RDONLY|O_NONBLOCK,0);
if(n=read(fd,buf,sizeof(buf))>0)
{
write(STDOUT_FILENO,buf,sizeof(buf));
//if(strlen(buf)>0)
//printf("%s",buf);
close(fd);
}
else
printf("no data in pipe");
sleep(1);
}
}

client端

#include<unistd.h>
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<stdio.h>
int main(void){
char FIFO[]="/root/myfifo";
char msg[8]="hello!\n";
char buf[8]={0};
//char stdo[35];
//unlink(FIFO);
//mkfifo(FIFO,0777);
while(1)
{
int fd=open(FIFO,O_WRONLY|O_NONBLOCK,0);
write(fd,msg,sizeof(msg));
close(fd);
sleep(10);
}
}

重点是在server端,我想让server一直读管道,但是在没有数据时,继续往下执行,输出“no data in pipe”,但是总不能达到目的,请高手指点一下。。。。

<无标签>
举报
半点竹节
发帖于6年前 8回/1K+阅
共有8个答案 最后回答: 6年前

你现在啥反应?出于什么目的在循环内反复OPEN CLOSE ? 哈。另外你希望是什么样的,我是说和现在的差异?我暂时没开发机器RUN 你的代码。

--- 共有 1 条评论 ---
周翼翼去看我的问题.~~ 6年前 回复
我好想说的很清楚啊,呵呵
--- 共有 2 条评论 ---
半点竹节回复 @中山野鬼 : 我就是想测试一下,其实打开一次,不关闭也无所谓啦,望大虾给看一下喽,感激不尽 6年前 回复
中山野鬼我以为你是前面可以非堵塞,但不能持续。另外你为什么不停的OPEN CLOSE?在SERVER?这块我没看懂你的目的。 6年前 回复

回头我帮你试试。管道我用的很少。非堵塞的更少,应该是没用过。 我说我用过就是忽悠你 。哈。

哈。我帮你试了一下你的代码。你的错误不是管道错误。是printf的问题。由于我以前printf基本坚持使用带\n的,特别是循环里的,所以没有发生过你的问题。在

http://stackoverflow.com/questions/7384110/printf-without-n-does-not-display-text-when-placed-before-while1

给出了问题的解释。我又看了一下man,

http://linux.die.net/man/3/stdout

你也可以关注一下。其中有这个一段需要注意(靠,平时就是看哪看这么细,还要谢谢你的问题),

Partial lines will not appear until fflush(3) or exit(3) is called, or a newline is printed. This can produce unexpected results, especially with debugging output.

这里明确说了,如果没有一个newline的printed,是不会显示的,由此你进入else时,由于printf是按照lines来输出的。因此一直没有给出输出。你可以对printf添加 \n.或者 fflush(stdout);后者并不会换行。来解决。

你这样写第二次循环时,会得到ENXIO 的错误,fd就会变成-1,把本来正确打开的文件描述符给覆盖掉了啊,把open拿出去再改一下close吧,上面的printf是行缓冲的问题确实也有,再提一句stderr是无缓冲的,而你重定向到文件貌似就变成了全文缓冲的了。

最好还是把错误处理写出来不然找bug都不好找,errno还是很有用的。

顶部