dup(2) System Calls Manual dup(2)

dup, dup2, dup3 - kopieer een bestandsindicator

Standard C bibliotheek (libc, -lc)

#include <unistd.h>
int dup(int oudebi);
int dup2(int oudebi, int nieuwebi);
#define _GNU_SOURCE             /* Zie feature_test_macros(7) */
#include <fcntl.h>              /* Definitie van O_* constanten */
#include <unistd.h>
int dup3(int oudebi, int nieuwebi, int vlaggen);

De dup() systeem aanroep wijst een nieuwe bestandsindicator toe die wijst naar hetzelfde open bestandsindicator als de indicator oudebi. (Voor een uitleg over de open bestandsindicatoren, zie open(2).) Het nieuwe bestandsindicator getal is gegarandeerd de laagst genummerde bestandsindicator die ongebruikt was in het aanroepende proces.

Na een geslaagde terugkeer zijn de oude en nieuwe bestandsindicatoren uitwisselbaar (gelijk). Omdat de twee bestandsindicatoren naar dezelfde open bestandsindicator wijzen, delen ze dezelfde bestands positie en de bestands status vlaggen; bij voorbeeld, als de bestandspositie werd gewijzigd door lseek(2) te gebruiken op de een van de bestandsindicatoren, dan is de positie ook gewijzigde in de andere bestandsindicator.

De twee bestandsindicatoren delen de bestandsindicator vlag niet (de sluit-bij-uitvoer vlag). De sluit-bij-uitvoer vlag (FD_CLOEXEC; zie fcntl(2)) voor als de duplicaat indicator uit staat.

De dup2() systeem aanroep voert dezelfde taak uit als dup(), maar in plaats van het gebruiken van de laagst-genummerde niet gebruikte bestandsindicator, gebruikt deze het bestandsindicator nummer zoals gespecificeerd in nieuwebi. Met andere woorden, de bestandsindicator nieuwebi wordt aangepast zodat deze nu wijst naar dezelfde open bestandsindicator als oudebi.

Als de bestandsindicator nieuwebi eerder open was, dan wordt deze gesloten voordat hij wordt hergebruikt; het sluiten gebeurd stilzwijgend (m.a.w. opgetreden fouten tijdens het sluiten worden niet gerapporteerd door dup2()).

De stappen van het sluiten en hergebruiken van de bestandsindicator nieuwebi worden atomair uitgevoerd. Dit is belangrijk, want het implementeren van equivalente functionaliteit door het gebruik van close(2) en dup() zou een race conditie kunnen inhouden, waardoor nieuwebi zou kunnen worden geweigerd tussen de twee stappen. Zulk hergebruik kan optreden wanneer een hoofdprogramma wordt onderbroken door een signaal afhandelaar die een bestandsindicator toekent, of omdat een parallelle thread een bestandsindicator toekent.

Let op de volgende punten:

Als oudebi is geen geldige bestandsindicator, dan zal de aanroep falen, en nieuwebi wordt niet gesloten.
Als oudebi een geldige bestandsindicator is, en nieuwebi heeft dezelfde waarde als oudebi, dan doet dup2() niets, en retourneert nieuwebi.

dup3() is hetzelfde als dup2(), met uitname van:

De aanroeper kan het zetten van een sluit-bij-uitvoer vlag forceren voor een nieuwe bestandsindicator door O_CLOEXEC te specificeren in flags. Zie de beschrijving van dezelfde vlag in open(2) met redenen waarom dit nuttig is.
Als oudebi gelijk is aan nieuwebi, dan faalt dup3() met de fout EINVAL.

Bij succes, retourneren deze systeem aanroepen de nieuwe bestandsindicator. Bij een fout wordt -1 teruggegeven, en errno wordt overeenkomstig gezet om de fout te aan te geven.

oudebi is geen open bestandindicator.
nieuwebi ligt buiten de toegestane waardes voor bestandsindicators. (zie de discussie over RLIMIT_NOFILE in getrlimit(2)).
(Alleen Linux) Dit kan worden teruggegeven door dup2() of dup3 gedurende een race conditie met open(2) en dup().
De dup2() of dup3() aanroep werd onderbroken door een signaal; zie signal(7).
(dup3()) flags bevatten een ongeldige waarde..
(dup3()) oudebi was gelijk aan nieuwebi.
De per-proces limiet van het aantal open bestandsindicatoren is bereikt (zie de discussie over RLIMIT_NOFILE in getrlimit(2)).

POSIX.1-2008.
Linux.

POSIX.1-2001, SVr4, 4.3BSD.
Linux 2.6.27, glibc 2.9.

De teruggegeven fout door dup2() is anders dan die zoals teruggegeven door fcntl(..., F_DUPFD, ...) wanneer nieuwebi buiten bereik is. Op sommige systemen, retourneert dup2() ook soms EINVAL zoals F_DUPFD.

Als nieuwebi open was, dan zullen fouten die gerapporteerd zouden worden tijdens close(2) verloren geraakt zijn. Als dit een zorg is, —behalve als het programma single-threaded is en geen bestandsindicatoren in signaal afhandelaren alloceert)— dan is de correcte aanpak om de nieuwebi niet te sluiten dup2(), vanwege de race conditie zoals hierboven beschreven. In plaats daarvan zou de bijvoorbeeld de hieronder gegeven code gebruikt kunnen worden:


/* Obtain a duplicate of 'newfd' that can subsequently
   be used to check for close() errors; an EBADF error
   means that 'newfd' was not open. */
tmpfd = dup(newfd);
if (tmpfd == -1 && errno != EBADF) {
    /* Handle unexpected dup() error. */
}
/* Atomically duplicate 'oldfd' on 'newfd'. */
if (dup2(oldfd, newfd) == -1) {
    /* Handle dup2() error. */
}
/* Now check for close() errors on the file originally
   referred to by 'newfd'. */
if (tmpfd != -1) {
    if (close(tmpfd) == -1) {
        /* Handle errors from close. */
    }
}

close(2), fcntl(2), open(2), pidfd_getfd(2)

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.

3 mei 2023 Linux man-pagina's 6.05.01