Mar*_*jaS 3 c++ ipc process named-pipes
我在LINUX下用C++编程.我有两个独立的过程.我应该使用命名管道提供通信.
读者: - 使用mkfifo创建FIFO - status = mkfifo(myFIFO,0666) - 使用open打开管道 - fifo = open(myFIFO,O_RDONLY) - 从管道读取 - num = read(fifo,temp,sizeof(temp))
作家:-opens pipe - fifo = open(myFIFO,O_WRONLY); -writes to pipe - num = write(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);
}
Run Code Online (Sandbox Code Playgroud)
在另一个文件中:
// 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;
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
您的代码中至少有四个错误.创建FIFO时,必须使用"打开"调用返回的文件描述符.但是,您将它与0进行比较,并将比较结果分配给用于保存文件描述符的变量:
if (fifo = open(myFIFO, O_RDONLY) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正确的代码应如下所示:
fifo = open(myFIFO, O_RDONLY);
if (fifo < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者像这样,如果你坚持保存一行代码:
if ((fifo = open(myFIFO, O_RDONLY)) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
与阅读完全相同的故事:
if (num= read(fifo, temp, sizeof(temp)) < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正确的代码:
num = read(fifo, temp, sizeof(temp));
if (num < 0) {
printf("\n %s \n", strerror(errno));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在写入FIFO的代码中,完全相同的两个错误.