oracular (2) dup.2.gz

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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.