Scroll to navigation

DUP(2) Linux Programmeurs Handleiding DUP(2)

NAAM

dup, dup2, dup3 - kopieer een bestandsindicator

SAMENVATTING

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

BESCHRIJVING

De dup() systeem aanroep maakt een kopie van de bestandsindicator oudebi, gebruik makend van de laagst-genummerde niet-gebruikte bestandsindicator voor de nieuwe indicator.

Na geslaagd terugkeren, mogen de oude en de nieuwe indicatoren door elkaar gebruikt worden. Ze wijzen naar dezelfde open bestandsindicator (zie open(2)) en delen dus dezelfde bestandspositie en bestand status vlaggen; bij voorbeeld als de bestandspositie werd gewijzigde door lseek(s) op een van de bestandsindicatoren, dan wordt de positie ook gewijzigd in de andere.

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.

dup2()

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. Als de bestandsindicator nieuwebi eerder open was, dan wordt deze stilzwijgend gesloten voor dat hij wordt hergebruikt.

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()

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.

EIND WAARDE

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.

FOUTEN

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)).

VERSIES

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

VOLDOET AAN

dup(), dup2(): POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

dup3() is Linux-specifiek.

OPMERKINGEN

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)\m 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:


/* Gebruik een duplicaat van 'nieuwebi' die achtereenvolgens gebruikt

kan worden om te controleren op close() fouten; een EBADF fout
betekent dat 'nieuwebi' niet open was. */ tmpfd = dup(newfd); if (tmpfd == -1 && errno != EBADF) {
/* Handel onverwachte dup() fout af */ } /* Atomair duplicaat 'oudebi' aan 'nieuwebi'. */ if (dup2(oudebi, nieuwebi) == -1) {
/* Handel dup2() fout af */ } /* Controleer nu op close() fouten in het originele bestand
aangewezen door 'nieuwebi'. */ if (tmpfd != -1) {
if (close(tmpfd) == -1) {
/* Handel fouten van close af. */
} }

ZIE OOK

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

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.

1 november 2020 Linux