Scroll to navigation

PIPE(2) Linux Programmeurs Handleiding PIPE(2)

NAAM

pipe, pipe2 - maak pipe

SAMENVATTING

#include <unistd.h>
/* OnpAlpha, IA-64, MIPS, SuperH, and SPARC/SPARC64; zie NOTITIES */
struct fd_pair {
long fd[2];
};
struct fd_pair pipe();
/* Op alle andere architecturen */
int pipe(int pipefd[2]);
#define _GNU_SOURCE             /* Zie feature_test_macros(7) */
#include <fcntl.h>              /* Verkrijg O_* constanten definities */
#include <unistd.h>
int pipe2(int pipe_bes_ind[2], int vlaggen);

BESCHRIJVING

pipe() maakt een pijp aan: een uni-directioneel data kanaal dat kan worden gebruikt voor interprocess communicatie. Het array pipefd wordt gebruikt om twee bestandsbeschrijving te retourneren die naar de uiteinden van de pijp wijzen. pipefd[0] wijst naar het lees-uiteinde van de pijp. pipefd[1] wijst naar het schrijf-uiteinde van de pijp. Data geschreven naar het schrijf-uiteinde van de pijp wordt gebufferd door de kernel totdat deze werd gelezen aan het lees-uiteinde van de pijp. Voor verder details, ziepipe(7).

Als vlaggen is 0, dan is pipe2() hetzelfde als pipe(). De volgende waarden kunnen per bit worden geOF´ed in vlaggen om ander gedrag te verkrijgen:

Zet de sluit-bij-exec (FD_CLOEXEC) vlag op twee nieuwe bestandsbeschrijvingen. Zie de beschrijving van dezelfde vlag in open(2) voor redenen waarom dit bruikbaar kan zijn.
Maak een pijp aan die Invoer/Uitvoer in pakket modus uitvoert. Elke write(2) naar de pijp wordt behandeld als een apart pakket, en read(2)s van deze pijp leest een pakket per tijdseenheid. Let op de volgende punten:
  • Het schrijven van meer dan PIPE_BUF bytes (zie pipe(7) wordt gesplitst in meerdere pakketten. De constante PIPE_BUF is gedefinieerd in <limits.h>.
  • Als read(2) een buffer grootte opgeeft die kleiner is dan het volgende pakket, dan zal het gevraagde aantal bytes worden gelezen, en zullen de overmaat aan bytes in het pakket worden weggegooid. Opgeven van een buffer grootte van PIPE_BUF is voldoende om de grootst mogelijke pakketten te lezen (zie het voorgaande punt).
  • Nul-lengte pakketten worden niet ondersteund. (Een read(2) die een buffer grootte van nul opgeeft is een ongeldige operatie en geeft 0 terug.)
Oudere kernels die deze vlag niet ondersteunen zullen dit kenbaar maken door middel van een EINVAL fout.
Vanaf Linux 4.5 is het mogelijk om de O_DIRECT instelling van een pijp bestandsbeschrijving te veranderen met fcntl(2).
Stel de O_NONBLOCK bestandsstatus vlag in op de open bestandsbeschrijving aangewezen naar door een nieuwe bestandsbeschrijving. Het gebruiken van deze vlag bespaart extra aanroepen van fcntl(2) om hetzelfde resultaat te bereiken.

EIND WAARDE

Bij succes wordt nul teruggegeven. Bij falen wordt -1 teruggegeven, wordt errno overeenkomstig gezet, en pipefd blijft ongewijzigd.

Op Linux (en andere systemen), verandert pipe() de pipefd niet na een fout. Een eis om dit gedrag te standaardiseren werd toegevoegd in POSIX.1-2008 TC2. De Linux-specifieke pipe2() systeem aanroep doet hetzelfde en verandert pipefd niet bij een fout.

FOUTEN

pipe_bes_ind is ongeldig.
(pipe2()) Ongeldige waarde in vlaggen.
De per-proces limiet van het aantal open bestandsbeschrijvingen werd bereikt.
De grens aan het aantal open bestanden van het systeem is bereikt.
De harde grens van gebruikers geheugen dat kan worden toegewezen aan pijpen werd bereikt en de aanroeper was niet gerechtigd; zie pipe(7).

VERSIES

pipe2() werd toegevoegd aan Linux in versie 2.6.27; glibc ondersteuning is beschikbaar vanaf versie 2.9.

VOLDOET AAN

pipe(): POSIX.1-2001, POSIX.1-2008.

pipe2() is Linux-specifiek.

OPMERKINGEN

De Systeem V ABI op sommige architecturen staat toe om meer dan een register te gebruiken om meerdere waarden terug te geven; verschillende architecturen

(namelijk Alpha, IA-64, MIPS, SuperH en SPARC/SPARC64) (mis)/(ge)bruiken deze eigenschap om de pipe() systeem aanroep in een functionele manier te implementeren: de aanroep gebruikt geen argumenten en geeft een paar bestandsbeschrijvingen terug bij succes. De glibc pipe() omwikkel functie handelt dit transparant af. Zie syscall(2) voor informatie betreffende registers die gebruikt worden om de tweede bestandsbeschrijving op te slaan.

VOORBEELDEN

Het volgende programma maakt een pijp aan, vervolgens wordt fork(2) gebruikt om een kind proces aan te maken; dit kind erft een dubbele set bestandsbeschrijvingen die naar dezelfde pijp wijzen. Na de fork(2) sluit elk proces de bestandsbeschrijving die het niet nodig heeft voor de pijp (zie pipe(7)). Het ouder proces schrijft vervolgens de tekenreeks bevat in de commando regel van het programma naar de pijp, en het kind leest deze tekenreeks byte voor byte van de pijp en echo´ed deze naar de standaard uitvoer.

Programma bron

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int
main(int argc, char *argv[])
{

int pipefd[2];
pid_t cpid;
char buf;
if (argc != 2) {
fprintf(stderr, "Usage: %s <string>\n", argv[0]);
exit(EXIT_FAILURE);
}
if (pipe(pipefd) == -1) {
perror("pipe");
exit(EXIT_FAILURE);
}
cpid = fork();
if (cpid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (cpid == 0) { /* kind leest van de pijp */
close(pipefd[1]); /* Sluit het ongebruikte schrijf-einde */
while (read(pipefd[0], &buf, 1) > 0)
write(STDOUT_FILENO, &buf, 1);
write(STDOUT_FILENO, "\n", 1);
close(pipefd[0]);
_exit(EXIT_SUCCESS);
} else { /* Ouder schrijft argv[1] naar de pijp */
close(pipefd[0]); /* Sluit ongebruikt lees-einde */
write(pipefd[1], argv[1], strlen(argv[1]));
close(pipefd[1]); /* Lezer zal EOF zien */
wait(NULL); /* Wacht op het kind */
exit(EXIT_SUCCESS);
} }

ZIE OOK

fork(2), read(2), socketpair(2), splice(2), tee(2), vmsplice(2), write(2), popen(3), pipe(7)

COLOFON

Deze pagina is onderdeel van release 5.10 van het Linux man-pages-project. Een beschrijving van het project, informatie over het melden van bugs en de nieuwste versie van deze pagina zijn op https://www.kernel.org/doc/man-pages/ te vinden.

VERTALING

De Nederlandse vertaling van deze handleiding is geschreven door Jos Boersema <joshb@xs4all.nl>, Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>

Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.

Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.

9 juni 2020 Linux