Bagaimana cara menutup pipa bernama (dengan demikian memungkinkannya untuk kucing)?

3

Saya perlu bantuan menutup pipa bernama. Saya membuat fifo bernama via mkfifo myfifo, kemudian beberapa file yang dapat dieksekusi C ++ menulis / membaca dari myfifo, dan sekarang saya ingin menutupnya (jadi saya bisa catisinya untuk membacanya).

Namun, saya membaca man mkfifohalaman, dan juga googled sekitar, tetapi saya tidak dapat menemukan perintah khusus untuk menutup fifo (bahkan setelah semua executable selesai menggunakannya).


Perintah yang terlibat adalah:

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

(executable Adan Bberinteraksi satu sama lain melalui myfifo)


Ini adalah file

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

Dalam program di atas, ini seharusnya terjadi: A output 1. B membaca 1 dan output 2. A membaca 2 dan output 4. Kemudian program berakhir.

Gaurang Tandon
sumber
Hentikan ./Aatau ./B.
Cyrus
@Cyrus tetapi bagaimana cara melakukannya?
Gaurang Tandon

Jawaban:

4

Ini adalah bahwa setelah konten FIFO dikonsumsi, mereka tidak akan tetap berada di FIFO. Dengan demikian, tidak mungkin untuk mencetak semua konten FIFO nanti (hanya mereka yang tidak dikonsumsi yang akan tetap).

Satu-satunya cara untuk mengetahui apa yang sedang dikirim ke FIFO adalah mencetak hal yang sama ke file yang terpisah (mungkin membebani operator penyisipan aliran <<).

Gaurang Tandon
sumber