pipe(2) | System Calls Manual | pipe(2) |
pipe, pipe2 - maak pipe
Standard C bibliotheek (libc, -lc)
#include <unistd.h>
int pipe(int pipefd[2]);
#define _GNU_SOURCE /* Zie feature_test_macros(7) */ #include <fcntl.h> /* Definitie van O_* constanten */ #include <unistd.h>
int pipe2(int pipe_bes_ind[2], int vlaggen);
/* Op Alpha, IA-64, MIPS, SuperH, en SPARC/SPARC64, heeft pipe() het
volgende prototype; zie NOTITIES */
#include <unistd.h>
struct fd_pair { long fd[2]; }; struct fd_pair pipe(void);
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:
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.
pipe2() werd toegevoegd aan Linux 2.6.27; glibc ondersteuning is beschikbaar vanaf glibc 2.9.
pipe(): POSIX.1-2001, POSIX.1-2008.
pipe2() is Linux-specifiek.
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.
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.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/wait.h> #include <unistd.h> int main(int argc, char *argv[]) {
int pipefd[2];
char buf;
pid_t cpid;
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);
} }
fork(2), read(2), socketpair(2), splice(2), tee(2), vmsplice(2), write(2), popen(3), pipe(7)
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.
5 februari 2023 | Linux man-pagina's 6.03 |