dup() i dup2() Wywołanie systemowe Linuksa

dup() i dup2() Wywołanie systemowe Linuksa

dup()

Wywołanie systemowe dup() tworzy kopię deskryptora pliku.

  • Dla nowego deskryptora używany jest nieużywany deskryptor o najniższym numerze.
  • Jeśli kopia zostanie utworzona pomyślnie, deskryptory pliku oryginału i kopii mogą być używane zamiennie.
  • Obydwa odnoszą się do tego samego opisu otwartego pliku i w związku z tym współdzielą flagi przesunięcia i statusu pliku.

Składnia:

    int dup(int oldfd);     
oldfd: old file descriptor whose copy is to be created. C
   // C program to illustrate dup()    #include      #include         #include         int     main  ()   {      // open() returns a file descriptor file_desc to a       // the file 'dup.txt' here'      int     file_desc     =     open  (  'dup.txt'       O_WRONLY     |     O_APPEND  );          if  (  file_desc      <     0  )      printf  (  'Error opening the file  n  '  );          // dup() will create the copy of file_desc as the copy_desc      // then both can be used interchangeably.      int     copy_desc     =     dup  (  file_desc  );          // write() will write the given string into the file      // referred by the file descriptors      write  (  copy_desc    'This will be output to the file named dup.txt  n  '       46  );          write  (  file_desc    'This will also be output to the file named dup.txt  n  '       51  );          return     0  ;   }   

Należy pamiętać, że ten program nie będzie działał w kompilatorze online, ponieważ obejmuje otwieranie pliku i zapisywanie na nim.

Wyjaśnienie:

Metoda open() zwraca deskryptor pliku file_desc do pliku o nazwie „dup.txt”. file_desc można wykorzystać do wykonania pewnych operacji na pliku „dup.txt”. Po użyciu wywołania systemowego dup() tworzona jest kopia file_desc copy_desc. Kopię tę można również wykorzystać do wykonania pewnych operacji na tym samym pliku „dup.txt”. Po dwóch operacjach zapisu, jednej z file_desc i drugiej z copy_desc, edytowany jest ten sam plik, tj. „dup.txt”. Przed uruchomieniem kodu Niech plik „dup.txt” przed operacją zapisu będzie wyglądał jak pokazano poniżej:

dup() i dup2() Wywołanie systemowe Linuksa

Po uruchomieniu programu C pokazanego powyżej plik „dup.txt” wygląda następująco:

dup() i dup2() Wywołanie systemowe Linuksa

dup2()

Wywołanie systemowe dup2() jest podobne do dup(), ale podstawowa różnica między nimi polega na tym, że zamiast używać nieużywanego deskryptora pliku o najniższym numerze, używa numeru deskryptora określonego przez użytkownika.

Składnia:

 int dup2(int oldfd int newfd);   
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.

Ważne punkty:

  • Dołącz plik nagłówkowy unistd.h umożliwiający korzystanie z wywołań systemowych dup() i dup2().
  • Jeśli deskryptor newfd był wcześniej otwarty, zostanie on cicho zamknięty przed ponownym użyciem.
  • Jeśli oldfd nie jest prawidłowym deskryptorem pliku, wywołanie nie powiedzie się, a newfd nie zostanie zamknięte.
  • Jeśli oldfd jest poprawnym deskryptorem pliku, a newfd ma tę samą wartość co oldfd, wówczas dup2() nie robi nic i zwraca newfd.

Trudne użycie wywołania systemowego dup2():

Podobnie jak w dup2() zamiast newfd można umieścić dowolny deskryptor pliku. Poniżej znajduje się implementacja C, w której używany jest deskryptor pliku standardowego wyjścia (stdout). Spowoduje to zapisanie wszystkich instrukcji printf() w pliku, do którego odnosi się stary deskryptor pliku.

C
   // C program to illustrate dup2()    #include      #include      #include      #include      int     main  ()   {      int     file_desc     =     open  (  'tricky.txt'    O_WRONLY     |     O_APPEND  );          // here the newfd is the file descriptor of stdout (i.e. 1)      dup2  (  file_desc       1  )     ;             // All the printf statements will be written in the file      // 'tricky.txt'      printf  (  'I will be printed in the file tricky.txt  n  '  );       return     0  ;   }   

Można to zobaczyć na poniższym rysunku: Niech plik „tricky.txt” przed operacją dup2() będzie wyglądał tak, jak pokazano poniżej:

dup() i dup2() Wywołanie systemowe Linuksa

Po uruchomieniu programu C pokazanego powyżej plik „tricky.txt” wygląda następująco:

dup() i dup2() Wywołanie systemowe Linuksa Utwórz quiz