Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       dup, dup2, dup3 - duplikuje deskryptor pliku

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <unistd.h>

       int dup(int oldfd);
       int dup2(int oldfd, int newfd);

       #define _GNU_SOURCE             /* Zob. feature_test_macros(7) */
       #include <fcntl.h>              /* Definicja stałych O_* */
       #include <unistd.h>

       int dup3(int oldfd, int newfd, int flags);

OPIS

       Wywołanie  systemowe  dup() przydziela nowy deskryptor pliku odnoszący się do tego samego opisu otwartego
       pliku (OFD), jak deskryptor oldfd  (wyjaśnienie  opisów  otwartych  plików  znajduje  się  w  podręczniku
       open(2)).  Gwarantuje  się,  że nowy numer deskryptora pliku będzie najniższym numerem deskryptora pliku,
       który nie był używany w trakcie procesu wywoływania.

       Po pomyślnym zakończeniu, stary i nowy deskryptor mogą być używane zamiennie. Oba deskryptory odnoszą się
       do tego samego opisu otwartego pliku, zatem współdzielą one przesunięcie pliku i znaczniki statusu  pliku
       np.  jeśli  przesunięcie pliku zmieni się w wyniku użyciu lseek(2) na jednym z deskryptorów pliku, zmieni
       się ono także dla drugiego deskryptora pliku.

       Oba deskryptory nie dzielą znaczników  deskryptora  pliku  (znacznika  zamknij-przy-wykonaniu).  Znacznik
       zamknij-przy-wykonaniu (FD_CLOEXEC; zob. fcntl(2)) dla duplikatu deskryptora jest wyłączony.

   dup2()
       Wywołanie  systemowe dup2() wykonuje takie samo zadanie jak dup(), lecz zamiast używać najniższego numeru
       nieużywanego deskryptora pliku, używa numeru deskryptora pliku podanego w newfd. Innymi słowy, deskryptor
       pliku newfd jest dostosowywany tak, aby wskazywał teraz na ten sam opis otwartego pliku (ODF) jak oldfd.

       Jeśli deskryptor pliku newfd był uprzednio otwarty, jest zamykany przed ponownym użyciem; zamknięcie jest
       przeprowadzane po cichu (tj. ewentualne błędy przy zamknięciu nie są zgłaszane przez dup2()).

       Kroki zamykania i ponownego użycia deskryptora pliku newfd są wykonywane niepodzielnie. Jest to  istotne,
       ponieważ  próba  zaimplementowania równoważnej funkcjonalności za pomocą close(2) i dup() prowadziłaby do
       hazardu, gdzie newfd mógłby być użyty ponownie pomiędzy oboma krokami. Mogłoby  się  tak  zdarzyć,  gdyby
       główny  program  został  przerwany procedurą obsługi sygnału przydzielającego deskryptor plików lub gdyby
       równoległe wątki przydzielały deskryptor plików.

       Proszę zauważyć, co następuje:

       •  Jeśli oldfd nie jest prawidłowym  deskryptorem  pliku,  to  wywołanie  zawiedzie,  a  newfd  nie  jest
          zamykane.

       •  Jeśli  oldfd  jest  prawidłowym  deskryptorem  pliku,  a  newfd ma tę samą wartość co oldfd, to dup2()
          niczego nie dokona i zwróci newfd.

   dup3()
       dup3() działa jak dup2(), tyle że:

       •  Wywołujący może wymusić, aby znacznik zamknięcia-przy-wykonaniu był ustawiony dla  nowego  deskryptora
          pliku  podając  O_CLOEXEC  w  flags. Proszę zapoznać się z opisem tego samego znacznika w open(2), aby
          przekonać się, dlaczego może być to użyteczne.

       •  Jeśli oldfd równa się newfd, to dup3()  zawodzi z błędem EINVAL.

WARTOŚĆ ZWRACANA

       W przypadku powodzenia, te wywołania zwracają nowy deskryptor pliku. W razie wystąpienia  błędu  zwracane
       jest -1 i ustawiane jest errno wskazując błąd.

BŁĘDY

       EBADF  oldfd nie jest otwartym deskryptorem pliku.

       EBADF  newfd  jest  poza  dozwolonym  przedziałem  dla  deskryptorów  pliku  (zob.  opis  RLIMIT_NOFILE w
              getrlimit(2)).

       EBUSY  (tylko Linux)  Błąd może być zwrócony przez dup2()  lub  dup3()  w  razie  wystąpienia  wyścigu  z
              open(2) i dup().

       EINTR  Wywołanie dup2() lub dup3() przerwano sygnałem; zob. signal(7).

       EINVAL (dup3())  flags zawiera nieprawidłową wartość.

       EINVAL (dup3())  oldfd było równe newfd.

       EMFILE Zostało  osiągnięte  ograniczenie  na  liczbę otwartych deskryptorów plików dla procesu (zob. opis
              RLIMIT_NOFILE w getrlimit(2)).

STANDARDY

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

       dup3() Linux.

HISTORIA

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

       dup3() Linux 2.6.27, glibc 2.9.

UWAGI

       Błąd zwracany przez dup2() jest inny niż zwracany przez fcntl(..., F_DUPFD,  ...)  gdy  newfd  jest  poza
       zakresem. W niektórych systemach dup2() zwraca też czasem EINVAL jako F_DUPFD.

       Jeśli  newfd  był  otwarty,  wszelkie  błędy,  które mogłyby zostać zgłoszone w chwili wykonania close(2)
       zostaną utracone. Jeśli jest to  istotne,  to  –  o  ile  program  jest  jednowątkowy  i  nie  przydziela
       deskryptorów  pliku w procedurach obsługi sygnału – prawidłowym podejściem jest nie zamykanie newfd przez
       wywołanie dup2(), ze względu na sytuację hazardu opisaną powyżej. Zamiast tego, można użyć kodu podobnego
       do poniższego:

           /* Pozyskanie duplikatu 'newfd', którego można
              następnie użyć do sprawdzenia błędów close(); błąd EBADF
              oznacza, że 'newfd' nie był otwarty. */

           tmpfd = dup(newfd);
           if (tmpfd == -1 && errno != EBADF) {
               /* Obsługa nieoczekiwanego błędu dup(). */
           }

           /* Niepodzielne zduplikowanie 'oldfd' w 'newfd'. */

           if (dup2(oldfd, newfd) == -1) {
               /* Obsługa błędu dup2(). */
           }

           /* Teraz sprawdzenie błędów close() pliku, do którego
              'newfd' odnosił się pierwotnie. */

           if (tmpfd != -1) {
               if (close(tmpfd) == -1) {
                   /* Obsługa błędów z close. */
               }
           }

ZOBACZ TAKŻE

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

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika  są:  Przemek  Borys  <pborys@dione.ids.pl>,
       Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją.  Bliższe informacje o warunkach licencji można uzyskać
       zapoznając  się  z  GNU General Public License w wersji 3  lub  nowszej.   Nie   przyjmuje   się   ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy  w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej manpages-pl-
       list@lists.sourceforge.net.

Linux man-pages 6.8                              2 maja 2024 r.                                           dup(2)