4 Stimmen

Verwendung benannter Leitungen in einem einzigen Prozess

Ich versuche, eine benannte Pipe für die Kommunikation innerhalb eines Prozesses zu verwenden. Hier ist der Code

#include <stdio.h>
#include <fcntl.h>
#include <signal.h>

void sigint(int num)
{
    int fd = open("np", O_WRONLY);
    write(fd, "y", 1);
    close(fd);
}

main()
{
    char ch[1];
    int fd;

    mkfifo("np", 0666);

    signal(SIGINT, sigint);

    fd = open("np", O_RDONLY);

    read(fd, ch, 1);

    close(fd);

    printf("%c\n", ch[0]);
    return;
}

Was ich will, ist, dass main blockiert, bis etwas in die Pipe geschrieben wird. Das Problem ist, dass der Signalhandler sigint() nach dem Öffnen der Pipe ebenfalls blockiert. Soll dies geschehen, da die Pipe bereits zuvor in main() zum Lesen geöffnet wurde?

4voto

Anonym Punkte 3068

Sie blockieren in open(), indem Sie ein Fifo für Leseblöcke öffnen, bis jemand es zum Schreiben öffnet.

Und das Öffnen einer Fifo zum Schreiben blockiert, bis jemand sie zum Lesen öffnet.

der Signalhandler läuft im selben Thread wie Ihr main(), so dass Sie einen Deadlock bekommen. Keiner von beiden wird in der Lage sein, den Fifo zu öffnen.

Sie können überprüfen, was vor sich geht, indem Sie Ihr Programm unter strace .

1voto

user231967 Punkte 1905

Aus der Manpage:

Öffnen eines FIFOs zum normalen Lesen blockiert, bis ein anderer Prozess den denselben FIFO zum Schreiben öffnet und umgekehrt umgekehrt.

und:

Ein Prozess kann einen FIFO öffnen in nicht-blockierenden Modus öffnen. In diesem Fall wird das Öffnen nur zum Lesen erfolgreich sein auch wenn noch niemand auf der Schreibseite geöffnet hat Seite noch niemand geöffnet hat; das Öffnen nur zum Schreiben wird mit ENXIO fehlschlagen (kein solches Gerät oder Adresse), es sei denn, das andere Ende wurde bereits geöffnet wurde.

Unter Linux wird das Öffnen eines FIFO zum Lesen und Schreiben sowohl im blockierenden blockierenden als auch im nicht-blockierenden Modus. POSIX lässt dieses Verhalten undefiniert. Diese kann verwendet werden, um einen FIFO zum Schreiben zu öffnen zu öffnen, während keine Leser verfügbar sind. Ein Prozess, der beide Enden des Verbindung benutzt, um mit sich selbst zu kommunizieren mit sich selbst zu kommunizieren, sollte sehr vorsichtig sein, um Deadlocks zu vermeiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X