logo

trucada al sistema Linux dup() i dup2().

dup()

La crida al sistema dup() crea una còpia d'un descriptor de fitxer.

  • Utilitza el descriptor no utilitzat amb el nombre més baix per al descriptor nou.
  • Si la còpia es crea correctament, els descriptors de fitxer original i de còpia es poden utilitzar de manera intercanviable.
  • Tots dos fan referència a la mateixa descripció del fitxer obert i, per tant, comparteixen els indicadors d'estat del fitxer i de desplaçament del fitxer.

Sintaxi:



    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 filen');    // 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.txtn' 46);    write(file_desc'This will also be output to the file named dup.txtn' 51);    return 0; } 

Tingueu en compte que aquest programa no s'executarà al compilador en línia, ja que inclou obrir un fitxer i escriure-hi.

Explicació:

L'open() retorna un descriptor de fitxer file_desc al fitxer anomenat 'dup.txt'. file_desc es pot utilitzar per fer alguna operació amb el fitxer 'dup.txt'. Després d'utilitzar la crida al sistema dup() es crea una còpia de file_desc copy_desc. Aquesta còpia també es pot utilitzar per fer alguna operació de fitxer amb el mateix fitxer 'dup.txt'. Després de dues operacions d'escriptura, una amb file_desc i una altra amb copy_desc s'edita el mateix fitxer, és a dir, "dup.txt". Abans d'executar el codi, deixeu que el fitxer 'dup.txt' abans de l'operació d'escriptura sigui com es mostra a continuació:

trucada al sistema Linux dup() i dup2().

Després d'executar el programa C que es mostra a sobre, el fitxer "dup.txt" és el que es mostra a continuació:

trucada al sistema Linux dup() i dup2().

dup2()

La crida al sistema dup2() és similar a dup() però la diferència bàsica entre elles és que en comptes d'utilitzar el descriptor de fitxer no utilitzat amb el nombre més baix, utilitza el número de descriptor especificat per l'usuari.

Sintaxi:

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

Punts importants:

  • Inclou el fitxer de capçalera unistd.h per utilitzar la trucada al sistema dup() i dup2().
  • Si el descriptor newfd estava obert prèviament, es tanca en silenci abans de ser reutilitzat.
  • Si oldfd no és un descriptor de fitxer vàlid, la trucada falla i newfd no es tanca.
  • Si oldfd és un descriptor de fitxer vàlid i newfd té el mateix valor que oldfd, aleshores dup2() no fa res i retorna newfd.

Un ús complicat de la trucada al sistema dup2():

Com en dup2() en lloc de newfd, es pot posar qualsevol descriptor de fitxer. A continuació es mostra una implementació C en la qual s'utilitza el descriptor de fitxer de la sortida estàndard (stdout). Això farà que totes les sentències printf() s'escriguin al fitxer referit pel descriptor de fitxer antic.

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.txtn');   return 0; } 

Això es pot veure a la figura que es mostra a continuació: Deixeu que el fitxer 'tricky.txt' abans de l'operació dup2() sigui com es mostra a continuació:

trucada al sistema Linux dup() i dup2().

Després d'executar el programa C que es mostra a sobre, el fitxer 'tricky.txt' és com es mostra a continuació:

trucada al sistema Linux dup() i dup2(). Crea un qüestionari