用LINUX C命名管道实现进程间通信的题目,已写出代码,但有一个神奇的小问题,open路径正确却有时失败?

代码如下(完整代码太长,故只截取了能体现问题的测试代码):server(服务器):#include"/home/xiaoming/01117501/fifo.h"#inc... 代码如下(完整代码太长,故只截取了能体现问题的测试代码):

server(服务器):
#include"/home/xiaoming/01117501/fifo.h"
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
int main()
{
int pid,pip1,pip2,pip3,a,b;
char BUF1[50],BUF2[50],BUF[50];
CREATE_SERVER_FIFO_NAME(BUF);
mkfifo(BUF,FIFO_PERMISSIONS);
pip1=open(BUF,O_RDONLY);
read(pip1,&pid,4);
CREATE_CLIENT_READER_NAME(BUF1,pid);
CREATE_CLIENT_WRITER_NAME(BUF2,pid);
pip2=open(BUF1,O_WRONLY);
pip3=open(BUF2,O_RDONLY);
a=50;
b=1240;
write(pip2,&b,sizeof(b));
read(pip3,&a,sizeof(a));
printf("%d\n",a);
return 0;
}
client(客户端)头文件省略:
int main()
{
int pid,pip1,pip2,pip3,a,b;
char BUF1[50],BUF2[50],BUF[50];
CREATE_SERVER_FIFO_NAME(BUF);
pid=getpid();
pip1=open(BUF,O_WRONLY);
write(pip1,&pid,4);
CREATE_CLIENT_READER_NAME(BUF1,pid);
CREATE_CLIENT_WRITER_NAME(BUF2,pid);
mkfifo(BUF1,FIFO_PERMISSIONS);
mkfifo(BUF2,FIFO_PERMISSIONS);
pip2=open(BUF1,O_RDONLY);
pip3=open(BUF2,O_WRONLY);
a=1056;
b=50;
read(pip2,&b,sizeof(int));
write(pip3,&a,sizeof(a));
printf("%d\n",b);
return 0;
}
用到的宏定义fifo.h
# define SERVER_FIFO_FILENAME "ServerFifo__"
# define CLIENT_FIFO_READER_NAME "ClientReaderFifo__"
# define CLIENT_FIFO_WRITER_NAME "ClientWriterFifo__"
// _BUF_ is a char * _PID_ is an int
# define CREATE_SERVER_FIFO_NAME(_BUF_) sprintf(_BUF_,"%s/%s"\
,getenv("HOME"),SERVER_FIFO_FILENAME);
# define CREATE_CLIENT_READER_NAME(_BUF_,_PID_) sprintf(_BUF_,"%s/%s%d"\
,getenv("HOME"),CLIENT_FIFO_READER_NAME,_PID_);
# define CREATE_CLIENT_WRITER_NAME(_BUF_,_PID_) sprintf(_BUF_,"%s/%s%d"\
,getenv("HOME"),CLIENT_FIFO_WRITER_NAME,_PID_);
# define FIFO_PERMISSIONS S_IRUSR | S_IWUSR
完整代码关于管道的创建打开等基本框架是相同的,只是加了许多具体内容。

然后在一个终端打开server,另一个终端打开client的话,有时server会提示open client创建的管道出错(我设置了判断是否出错),并且通过ERRNO显示错误类型为2,NO SUCH FILE OR DIRECTORY,然而我在之后又紧接着把reader和writer(即两个管道的路径)打出来,发现他们都是对的。open出错只会在第一次打开server出现,第二次肯定不会出现,而且第一次也不是一定出现,有时候不会出现,我试了半天也没发现规律。
PS:所有的测试都是在把以前创建的fifo删除的前提下进行的。
P.P.S:测试代码的问题貌似不在open上,在read和write那。。。凑合看吧,主要看补充
展开
 我来答
说学逗化石bv
2015-06-02 · TA获得超过758个赞
知道小有建树答主
回答量:1793
采纳率:58%
帮助的人:272万
展开全部
通常管道创建的时候会出现创建不成功的情况,要在管道创建的时候就进行异常处理,如果创建不成功就重新创建,这个错误是找不到管道文件
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式