2010-08-09 119 views
3

我正在用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; 
    } 
} 
+1

你可以在strace下运行它并发布日志吗? – jpalecek 2010-08-09 12:29:49

+1

请将管道命名并打开的代码以及读/写的位置发布。 – James 2010-08-09 12:34:25

+1

发布你的代码,当我们看到你的问题时,它会更容易帮助你。 – 2010-08-09 12:45:11

回答

1

的问题是在你的代码:fifo = open(myFIFO, O_WRONLY) < 0评估为fifo = (open(myFIFO, O_WRONLY) < 0)。您得到零,因为值open()返回的是>= 0

+0

非常感谢你! 我已经失去了3天,因为... 现在,它的工作... – MarijaS 2010-08-09 13:38:35

7

你的代码基本上至少有四个错误。创建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有完全相同的两个错误。

+0

你是完全正确的! 我正在寻找一个错误,但我没有看到这件事... 显然,我必须练习越来越多... 谢谢! – MarijaS 2010-08-09 13:59:26

+0

@MarijaS不客气。这是关于评估的顺序。这将自然而然地带来经验。我建议你在学习时不要尝试保存一行代码:-) – 2010-08-09 15:11:41