【问题标题】:Passing buffer between two terminals (Named Pipe)在两个终端之间传递缓冲区(命名管道)
【发布时间】:2016-02-26 05:36:40
【问题描述】:

对于这个糟糕的标题,我深表歉意,因为我不知道该如何措辞。我必须在 C++ 中为分配创建一个命名管道。我了解命名管道的工作原理以及每一行应该做什么,但我遇到了一个我和一个代码相同的朋友无法解决的问题。

这是一个简单的任务。我所要做的就是让一个程序创建命名管道并将用户输入的字符数组放入其中。第二个程序(在它自己的终端中)只是从管道中读取 char 数组并在终端中输出。

在下面的第二个程序第 11 行 (c = open("/tmp/myfifo", O_RDONLY);) 中,该程序似乎从未运行该行。当我在终端中运行它时,什么也没有发生,它只是坐在那里,好像它处于死锁状态。我的朋友没有这个问题,我们不知道是什么原因造成的。我正在使用默认终端在 Virtual Box 中的 Ubuntu 14.04.3 上运行。

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
#include <string>
using namespace std;

int main() {
    int a, b, c, res;
    string input;
    char buffer [50];
    b = access("/tmp/myfifo", F_OK);
    if (b == -1)
        a = mkfifo("/tmp/myfifo", 0777);
    c = ("/tmp/myfifo", O_WRONLY);
    getline(cin, input);
    for (int i = 0; i < input.size(); i++)
        buffer[i] = input.at(i);
    res = write(c, buffer, 50);
    close(c);
    return 0;
}

.

#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
using namespace std;

int main() {
    int c, res;
    char buffer [50];
    c = open("/tmp/myfifo", O_RDONLY);
    res = read(c, buffer, 50);
    close(c);
    cout<<buffer;
    return 0;
}

【问题讨论】:

    标签: c++ linux named-pipes


    【解决方案1】:

    您似乎在发件人的第 16 行缺少 open 一词。

    c = open("/tmp/myfifo", O_WRONLY);
    

    如果没有这个词,您的程序将调用逗号运算符,它将为c 分配O_WRONLY 的值,如here 所述。

    我在运行此程序时注意到的另一个独立错误是您没有在发送方初始化buffer,这意味着接收方可能会在实际字符串之后读取垃圾,因为没有空终止符。

    char buffer [50];
    memset(buffer, 0, 50);
    

    【讨论】:

    • 我一直在问我朋友那里有没有问题!!!我有一种感觉,这是一个问题,但我不知道需要去那里。管道现在正在工作,但我最终会像你说的那样得到垃圾。我尝试添加您给我的 memset 行,但出现编译错误。是在发送者文件还是接收者文件中?
    • 发件人文件。您需要 include &lt;string.h&gt; 获取 memset。
    • ...老实说,我不知道#include 与#include 不同。 #include 和 #include 之间有区别吗?我在高中上课时使用过 .h 文件,但在大学时从未使用过。
    • @user2872777,我不怪你。 string.h 是 C 头文件,而 string 是 C++ 头文件。我最近还没有真正看到#include &lt;iostream.h&gt; 的用法。您可以查看this question了解更多详情。
    • 好的,非常感谢。谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多