node.js - node fs.writeFileSync() returnerar aldrig


Jag skapar ett rör och försöker skriva till det. Men skrivandet fungerar aldrig.

import * as fs from 'fs';
import * as mkfifo from 'mkfifo';

mkfifo.mkfifoSync('/tmp/my_fifo', 0o600);

fs.writeFileSync('/tmp/my_fifo', 'Hey there!');

console.log('here');

Om jag kommenterar allt utom mkfifo.mkfifoSync('/tmp/my_fifo', 0o600); ser jag att röret skapas som det ska.

Men fs.writeFileSync('/tmp/my_fifo', 'Hej där!'); återvänder aldrig.

Även när jag använder callback-versionen `fs.writeFile()1` utlöses callbacken aldrig.

fs.writeFile('/tmp/my_fifo', 'Hey there!', (err) => {
    if (err) {
        return console.log('Write error: ' + err);
    }

    console.log('Write success');

    process.exit();
});

Återuppringningen anropas aldrig.

Vad gör jag för fel?

Bara som en kontroll öppnade jag och försökte läsa pipen från ett annat skript:

fs.readFile('/tmp/my_fifo', (err, data) => {
    if (err) {
        return console.log('Read error: ' + err);
    }

    console.log('Read success. Data is: ' + data);
});

På skribentsidan ser jag felet:

Error: ESPIPE: invalid seek, write

På läsarens sida ser jag:

Read success. Data is: 

tom data, men en lyckad läsning.

Uppdatering

Om jag inte skapar röret alls via mkfifoSync(), och istället bara anropar fs.writeFileSync(), kommer det att skapa och skriva till filen utan problem.

Så min fråga är hur skriver jag till detta rör?

Svar #1

du måste använda appendFileSync-metoden, inte writeFileSync-metoden, för att skriva till ett namngivet rör

lägg till i namngivna rör

const fs = require("fs");
const mkfifo = require("mkfifo");

mkfifo.mkfifoSync("/tmp/my_fifo", 0o600);
fs.appendFileSync("/tmp/my_fifo", "hello world", ...);

läsa från namngivna rör

const fs = require("fs");
console.log(fs.readFileSync("/tmp/my_fifo").toString());