我需要帮助来关闭命名管道。我通过 创建了命名 fifo mkfifo myfifo
,然后一些 C++ 可执行文件从 写入/读取myfifo
,现在我想关闭它(这样我就可以cat
读取其内容)。
但是,我阅读了该man mkfifo
页面,也在 Google 上搜索过,但却找不到任何关闭 fifo 的特定命令(即使在所有可执行文件都使用它之后)。
涉及的命令有:
$ mkfifo myfifo
$ ./A < myfifo | ./B > myfifo
$ # now i want to read myfifo
(可执行文件A
和B
通过 相互交互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 发送了什么内容的唯一方法是将同一件事打印到单独的文件中(可能会使流插入运算符超载<<
)。