Provided by: manpages-nl-dev_4.27.0-1_all bug

NAAM

       dup, dup2, dup3 - kopieer een bestandsindicator

BIBLIOTHEEK

       Standard C bibliotheek  (libc, -lc)

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>              /* Definitie van O_* constanten */
       #include <unistd.h>

       int dup3(int oudebi, int nieuwebi, int vlaggen);

BESCHRIJVING

       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.

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

       EBADF  oudebi is geen open bestandindicator.

       EBADF  nieuwebi  ligt  buiten  de  toegestane  waardes  voor  bestandsindicators.  (zie de discussie over
              RLIMIT_NOFILE in getrlimit(2)).

       EBUSY  (Alleen Linux) Dit kan worden teruggegeven door dup2() of dup3 gedurende  een  race  conditie  met
              open(2) en dup().

       EINTR  De dup2() of dup3() aanroep werd onderbroken door een signaal; zie signal(7).

       EINVAL (dup3())  flags bevatten een ongeldige waarde..

       EINVAL (dup3())  oudebi was gelijk aan nieuwebi.

       EMFILE De  per-proces  limiet  van  het aantal open bestandsindicatoren is bereikt (zie de discussie over
              RLIMIT_NOFILE in getrlimit(2)).

VOLDOET AAN

       dup()
       dup2() POSIX.1-2008.

       dup3() Linux.

GESCHIEDENIS

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

       dup3() Linux 2.6.27, glibc 2.9.

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)— 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. */
               }
           }

ZIE OOK

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

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.

Linux man-pagina's 6.9.1                           2 mei 2024                                             dup(2)