【问题标题】:Named pipes - Problem with write() and read()命名管道 - write() 和 read() 的问题
【发布时间】:2011-03-27 06:42:33
【问题描述】:

我在 LINUX 下使用 C++ 进行编程。 我有两个独立的进程。我应该使用命名管道提供通信。

读者: - 使用 mkfifo 创建 FIFO - status = mkfifo(myFIFO, 0666) - 使用 open - fifo = open (myFIFO,O_RDONLY) 打开管道 - 从管道读取 - num = read(fifo, temp, sizeof(temp))

作者: -打开管道 - fifo = open(myFIFO, O_WRONLY); - 写入管道 - 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);
}

在另一个文件中:

// 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;
     }
}

【问题讨论】:

  • 你能在 strace 下运行它并发布日志吗?
  • 请贴出命名和打开管道的代码,以及你在哪里读/写它。
  • 贴出你的代码,当我们看到你的问题时会更容易帮助你。
  • 我是 linux 新手,我尝试过使用 strace,但它没有用。我尝试使用 strace read.cpp...我必须在 google 上搜索更多有关 strace 的信息...
  • 你应该这样做strace your_binary

标签: c++ ipc process named-pipes


【解决方案1】:

问题出在您的代码中:fifo = open(myFIFO, O_WRONLY) &lt; 0 的计算结果为 fifo = (open(myFIFO, O_WRONLY) &lt; 0)。你得到零是因为open() 返回的值是&gt;= 0

【讨论】:

    【解决方案2】:

    您的代码中基本上至少有四个错误。创建 FIFO 时,必须使用“open”调用返回的文件描述符。但是,您将它与 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 欢迎您。这都是关于评估顺序的。这将随着经验自然而然地出现。我建议你在学习时不要尝试保存一行代码:-)
    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多