如何关闭命名管道(从而使其为 cat 启用)?

如何关闭命名管道(从而使其为 cat 启用)?

我需要帮助来关闭命名管道。我通过 创建了命名 fifo mkfifo myfifo,然后一些 C++ 可执行文件从 写入/读取myfifo,现在我想关闭它(这样我就可以cat读取其内容)。

但是,我阅读了该man mkfifo页面,也在 Google 上搜索过,但却找不到任何关闭 fifo 的特定命令(即使在所有可执行文件都使用它之后)。


涉及的命令有:

$ mkfifo myfifo
$ ./A < myfifo | ./B > myfifo
$ # now i want to read myfifo

(可执行文件AB通过 相互交互myfifo


这些是文件

// B.cpp

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

int main()
{
    ofstream file("inter.txt");
    int in = -1;
    if (file.is_open())
    {
        cin >> in;
        cout << (in + 1);
    }
    else
        cout << -1;
    file << in;
    file.close();
    return 0;
}

// A.cpp

#include <fstream>
#include <iostream>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
using namespace std;
#define PIPE "pipe.txt"
#define MAX_BUF 150

int main()
{
    ofstream file("inter2.txt");
    cout << 1 << endl;
    file << 1;
    int in;
    cin >> in;
    cout << 2 * in;
    file << 2 * in;
    file.close();
    return 0;
}

在上面的程序中,应该发生以下情况:A 输出 1。B 读取 1 并输出 2。A 读取 2 并输出 4。然后程序结束。

答案1

就是一旦 FIFO 中的内容被使用完,它们就不会再留在 FIFO 中。因此,以后不可能打印 FIFO 中的所有内容(只有那些没有被使用的内容才会保留)。

知道向 FIFO 发送了什么内容的唯一方法是将同一件事打印到单独的文件中(可能会使流插入运算符超载<<)。

相关内容