在两个终端之间传递缓冲区(命名管道)

Passing buffer between two terminals (Named Pipe)

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

这是一个简单的作业。我所要做的就是让一个程序创建命名管道并将用户输入的 char 数组放入其中。第二个程序(在它自己的终端中)只是从管道中读取 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;
}

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

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

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

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

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