Sie sind nicht ganz gleich in dem Sinne, dass das Aufrufen von pipe(2)
nicht ausreicht, um die äquivalente Funktion der Shell |
zu implementieren.
pipe(2)
erstellt zwei Dateideskriptoren (Leseende und Schreibende). Aber Sie müssen mehr als das tun, um |
Funktionalität zu implementieren.
Die typische Reihenfolge beim Erstellen eines Rohrs lautet wie folgt:
1) Erstellen Sie ein Leseende und ein Schreibende mit pipe(2)
.
2) Erstellen Sie einen untergeordneten Prozess mit fork()
.
3) Eltern- und Kindprozesse duplizieren die Dateideskriptoren mit dup2()
.
4) Beide Prozesse schließen jeweils ein Ende der Pipe (das eine Ende der Pipe, das jeder Prozess nicht verwendet).
5) Man schreibt in die Pipe und andere liest aus der Pipe.
Betrachten Sie ein einfaches Beispiel, um dies zu demonstrieren. In diesem übergeben Sie einen Dateinamen als Argument und der Elternprozess "greps" die Datei, die cat
vom Kind ist.
Dies entspricht dem Ausführen
%Vor%auf der Shell.
Das Shell-Pipe |
wird mit pipe(2)
und dup2(2)
Systemaufrufen implementiert.
Siehe Unix Pipes .
> Der von Shells verwendete pipe(2)
syscall für das Piping mit dem Operator |
|
ist die Implementierung der Shell, intern wird% syscall% co_de verwendet.