дуп() и дуп2() Линук системски позив

дуп() и дуп2() Линук системски позив

дуп()

Системски позив дуп() креира копију дескриптора датотеке.

  • За нови дескриптор користи некоришћени дескриптор са најмањим бројем.
  • Ако је копија успешно направљена, дескриптори датотеке оригинала и копије могу се користити наизменично.
  • Обе се односе на исти опис отворене датотеке и на тај начин деле помак датотеке и заставице статуса датотеке.

Синтакса:

    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  ;   }   

Имајте на уму да овај програм неће радити у компајлеру на мрежи јер укључује отварање датотеке и писање на њој.

Објашњење:

Опен() враћа дескриптор датотеке филе_десц у датотеку под називом 'дуп.ткт'. филе_десц се може користити за неке операције са датотеком 'дуп.ткт'. Након коришћења системског позива дуп() креира се копија филе_десц цопи_десц. Ова копија се такође може користити за обављање неке операције са истом датотеком 'дуп.ткт'. После две операције писања, једна са филе_десц и друга са цопи_десц иста датотека се мења, тј. 'дуп.ткт'. Пре покретања кода Нека датотека 'дуп.ткт' пре операције писања буде као што је приказано у наставку:

дуп() и дуп2() Линук системски позив

Након покретања Ц програма приказаног изнад, датотека 'дуп.ткт' је као што је приказано испод:

дуп() и дуп2() Линук системски позив

дуп2()

Системски позив дуп2() је сличан дуп(), али основна разлика између њих је у томе што уместо да користи неискоришћени дескриптор датотеке са најмањим бројем, користи број дескриптора који је одредио корисник.

Синтакса:

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

Важне тачке:

  • Укључите датотеку заглавља унистд.х за коришћење системског позива дуп() и дуп2().
  • Ако је дескриптор невфд претходно био отворен, тихо се затвара пре него што се поново користи.
  • Ако олдфд није важећи дескриптор датотеке, позив не успева и невфд се не затвара.
  • Ако је олдфд важећи дескриптор датотеке и невфд има исту вредност као олдфд онда дуп2() не ради ништа и враћа невфд.

Тешко коришћење системског позива дуп2():

Као у дуп2() уместо невфд-а може се ставити било који дескриптор датотеке. Испод је имплементација Ц у којој се користи дескриптор датотеке Стандардни излаз (стдоут). Ово ће довести до тога да све изјаве принтф() буду записане у датотеци на коју упућује стари дескриптор датотеке.

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  ;   }   

Ово се може видети на слици испод: Нека датотека 'трицки.ткт' пре операције дуп2() буде као што је приказано испод:

дуп() и дуп2() Линук системски позив

Након покретања Ц програма приказаног изнад, датотека 'трицки.ткт' је као што је приказано испод:

дуп() и дуп2() Линук системски позив Креирај квиз