命名管道 - 写入()和读取()的问题
我正在用C++编程,在LINUX下。 我有两个独立的进程。我应该使用命名管道提供通信。命名管道 - 写入()和读取()的问题
读卡器: - 创建使用FIFO mkfifo - 状态= mkfifo(myFIFO,0666) 使用开 - 打开所述管 - FIFO =开放(myFIFO,O_RDONLY)从管 -reads - NUM =读(FIFO, temp,sizeof(temp))
Writer: -opens pipe - fifo = open(myFIFO,O_WRONLY); - 写入管道 - num =写入(fifo,string,strlen(string));
我注意到,读取进程 返回的文件描述符和写入过程都是0.另外,在写入命令后,我可以在我的终端上看到应该写入管道的字符串。我不知道它为什么显示在终端上...此外,写入的字节数为0 ...
请你帮帮我吗? 谢谢!!!
// read.cpp:
#define myFIFO "/temp/FIFO"
int main(){
int num, fifo, status;
char temp[32];
if (status = mkfifo(myFIFO, 0666) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
if (fifo = open(myFIFO, O_RDONLY) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
if (num= read(fifo, temp, sizeof(temp)) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
printf("In FIFO is %s \n", temp);
}
而在另一个文件:
// write.cpp:
#define myFIFO "/temp/FIFO"
int main() {
int status, num, fifo;
char string[]="Testing...";
if (fifo = open(myFIFO, O_WRONLY) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
if (num= write(fifo, string, strlen(string)) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
}
的问题是在你的代码:fifo = open(myFIFO, O_WRONLY) < 0
评估为fifo = (open(myFIFO, O_WRONLY) < 0)
。您得到零,因为值open()
返回的是>= 0
。
非常感谢你! 我已经失去了3天,因为... 现在,它的工作... – MarijaS 2010-08-09 13:38:35
你的代码基本上至少有四个错误。创建FIFO时,必须使用由“打开”调用返回的文件描述符。但是,您和0比较,并分配一个比较一个变量,是为了保持一个文件描述符的结果:
if (fifo = open(myFIFO, O_RDONLY) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
正确的代码应该是这样的:
fifo = open(myFIFO, O_RDONLY);
if (fifo < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
或者这样,如果你坚持节约一行代码的:
if ((fifo = open(myFIFO, O_RDONLY)) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
并具有完全相同的故事阅读:
if (num= read(fifo, temp, sizeof(temp)) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
正确的代码:
num = read(fifo, temp, sizeof(temp));
if (num < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
在你的代码写入FIFO有完全相同的两个错误。
你是完全正确的! 我正在寻找一个错误,但我没有看到这件事... 显然,我必须练习越来越多... 谢谢! – MarijaS 2010-08-09 13:59:26
@MarijaS不客气。这是关于评估的顺序。这将自然而然地带来经验。我建议你在学习时不要尝试保存一行代码:-) – 2010-08-09 15:11:41
你可以在strace下运行它并发布日志吗? – jpalecek 2010-08-09 12:29:49
请将管道命名并打开的代码以及读/写的位置发布。 – James 2010-08-09 12:34:25
发布你的代码,当我们看到你的问题时,它会更容易帮助你。 – 2010-08-09 12:45:11