dup() e dup2() chiamata di sistema Linux

dup() e dup2() chiamata di sistema Linux

dup()

La chiamata di sistema dup() crea una copia di un descrittore di file.

  • Utilizza il descrittore inutilizzato con il numero più basso per il nuovo descrittore.
  • Se la copia viene creata con successo, i descrittori del file originale e della copia possono essere utilizzati in modo intercambiabile.
  • Entrambi fanno riferimento alla stessa descrizione del file aperto e quindi condividono l'offset del file e i flag di stato del file.

Sintassi:

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

Tieni presente che questo programma non verrà eseguito nel compilatore online poiché include l'apertura di un file e la scrittura su di esso.

Spiegazione:

open() restituisce un descrittore di file file_desc al file denominato 'dup.txt'. file_desc può essere utilizzato per eseguire alcune operazioni sui file con il file 'dup.txt'. Dopo aver utilizzato la chiamata di sistema dup() viene creata una copia di file_desc copy_desc. Questa copia può essere utilizzata anche per eseguire alcune operazioni sui file con lo stesso file "dup.txt". Dopo due operazioni di scrittura una con file_desc e un'altra con copy_desc lo stesso file viene modificato, ovvero 'dup.txt'. Prima di eseguire il codice, lascia che il file "dup.txt" prima dell'operazione di scrittura sia come mostrato di seguito:

dup() e dup2() chiamata di sistema Linux

Dopo aver eseguito il programma C mostrato sopra, il file "dup.txt" è come mostrato di seguito:

dup() e dup2() chiamata di sistema Linux

dup2()

La chiamata di sistema dup2() è simile a dup() ma la differenza fondamentale tra loro è che invece di utilizzare il descrittore di file inutilizzato con il numero più basso utilizza il numero di descrittore specificato dall'utente.

Sintassi:

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

Punti importanti:

  • Includere il file di intestazione unistd.h per utilizzare la chiamata di sistema dup() e dup2().
  • Se il descrittore newfd era precedentemente aperto, viene chiuso silenziosamente prima di essere riutilizzato.
  • Se oldfd non è un descrittore di file valido, la chiamata fallisce e newfd non viene chiuso.
  • Se oldfd è un descrittore di file valido e newfd ha lo stesso valore di oldfd allora dup2() non fa nulla e restituisce newfd.

Un uso complicato della chiamata di sistema dup2():

Come in dup2() al posto di newfd è possibile inserire qualsiasi descrittore di file. Di seguito è riportata un'implementazione C in cui viene utilizzato il descrittore di file dell'output standard (stdout). Ciò porterà tutte le istruzioni printf() ad essere scritte nel file a cui fa riferimento il vecchio descrittore di file.

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

Questo può essere visto nella figura mostrata di seguito: Lascia che il file 'tricky.txt' prima dell'operazione dup2() sia come mostrato di seguito:

dup() e dup2() chiamata di sistema Linux

Dopo aver eseguito il programma C mostrato sopra, il file "tricky.txt" è come mostrato di seguito:

dup() e dup2() chiamata di sistema Linux Crea quiz