logo

sistemski klic dup() in dup2() Linux

dup()

Sistemski klic dup() ustvari kopijo deskriptorja datoteke.

  • Za nov deskriptor uporablja neuporabljen deskriptor z najnižjo številko.
  • Če je kopija uspešno ustvarjena, se lahko deskriptorja datoteke izvirnika in kopije uporabljata izmenično.
  • Oba se nanašata na isti opis odprte datoteke in si tako delita zastavice za odmik in stanje datoteke.

Sintaksa:



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

Upoštevajte, da ta program ne bo deloval v spletnem prevajalniku, saj vključuje odpiranje datoteke in pisanje vanjo.

Pojasnilo:

Open() vrne deskriptor datoteke file_desc v datoteko z imenom 'dup.txt'. file_desc se lahko uporablja za izvedbo nekaterih datotečnih operacij z datoteko 'dup.txt'. Po uporabi sistemskega klica dup() se ustvari kopija file_desc copy_desc. To kopijo lahko uporabite tudi za izvajanje nekaterih datotečnih operacij z isto datoteko 'dup.txt'. Po dveh operacijah zapisovanja se ena s file_desc in druga s copy_desc uredi ista datoteka, tj. 'dup.txt'. Pred zagonom kode Naj bo datoteka 'dup.txt' pred operacijo zapisovanja, kot je prikazano spodaj:

sistemski klic dup() in dup2() Linux

Po zagonu zgoraj prikazanega programa C je datoteka 'dup.txt' taka, kot je prikazano spodaj:

sistemski klic dup() in dup2() Linux

dup2()

Sistemski klic dup2() je podoben dup(), vendar je osnovna razlika med njima v tem, da namesto uporabe neuporabljenega deskriptorja datoteke z najnižjo številko uporablja številko deskriptorja, ki jo določi uporabnik.

Sintaksa:

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

Pomembne točke:

  • Vključite datoteko glave unistd.h za uporabo sistemskega klica dup() in dup2().
  • Če je bil deskriptor newfd predhodno odprt, se pred ponovno uporabo tiho zapre.
  • Če oldfd ni veljaven deskriptor datoteke, klic ne uspe in newfd ni zaprt.
  • Če je oldfd veljaven deskriptor datoteke in ima newfd enako vrednost kot oldfd, potem dup2() ne naredi ničesar in vrne newfd.

Zapletena uporaba sistemskega klica dup2():

Tako kot v dup2() lahko namesto newfd postavite kateri koli deskriptor datoteke. Spodaj je implementacija C, v kateri je uporabljen datotečni deskriptor standardnega izhoda (stdout). To bo povzročilo, da bodo vsi stavki printf() zapisani v datoteko, ki jo navaja stari deskriptor datoteke.

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

To lahko vidite na spodnji sliki: Naj bo datoteka 'tricky.txt' pred operacijo dup2() taka, kot je prikazano spodaj:

sistemski klic dup() in dup2() Linux

Po zagonu zgoraj prikazanega programa C je datoteka 'tricky.txt' taka, kot je prikazano spodaj:

sistemski klic dup() in dup2() Linux Ustvari kviz