logo

dup() ja dup2() Linux-järjestelmäkutsu

dup()

Järjestelmäkutsu dup() luo kopion tiedostokuvauksesta.

  • Se käyttää uudelle kuvaajalle pienintä numeroitua käyttämätöntä kuvaajaa.
  • Jos kopio on luotu onnistuneesti, alkuperäisen ja kopiotiedoston kuvauksia voidaan käyttää vaihtokelpoisina.
  • Molemmat viittaavat samaan avoimeen tiedostokuvaukseen ja jakavat siten tiedostosiirtymän ja tiedoston tilalipun.

Syntaksi:



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

Huomaa, että tämä ohjelma ei toimi online-kääntäjässä, koska se sisältää tiedoston avaamisen ja siihen kirjoittamisen.

Selitys:

Open() palauttaa tiedostokuvaajan file_desc tiedostolle nimeltä "dup.txt". file_desc:llä voidaan tehdä joitakin tiedostotoimintoja tiedostolla "dup.txt". Kun dup()-järjestelmäkutsu on käytetty, tiedostosta file_desc luodaan kopio copy_desc. Tätä kopiota voidaan käyttää myös tiedostotoimintojen suorittamiseen samalla tiedostolla 'dup.txt'. Kahden kirjoitusoperaation jälkeen yksi tiedosto_desc ja toinen copy_desc muokataan samaa tiedostoa eli 'dup.txt'. Ennen koodin suorittamista Olkoon tiedoston 'dup.txt' ennen kirjoitustoimintoa alla olevan kuvan mukainen:

dup() ja dup2() Linux-järjestelmäkutsu

Yllä olevan C-ohjelman suorittamisen jälkeen tiedosto 'dup.txt' on seuraavanlainen:

dup() ja dup2() Linux-järjestelmäkutsu

dup2()

Järjestelmäkutsu dup2() on samankaltainen kuin dup(), mutta perusero niiden välillä on, että se käyttää pienimmän käyttämättömän tiedostokuvaajan sijaan käyttäjän määrittämää kuvaajanumeroa.

Syntaksi:

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

Tärkeitä kohtia:

  • Sisällytä otsikkotiedosto unistd.h dup()- ja dup2()-järjestelmäkutsujen käyttöä varten.
  • Jos kuvaaja newfd oli aiemmin auki, se suljetaan äänettömästi ennen uudelleenkäyttöä.
  • Jos oldfd ei ole kelvollinen tiedostokuvaaja, kutsu epäonnistuu ja newfd:tä ei suljeta.
  • Jos oldfd on kelvollinen tiedostokuvaaja ja newfd:llä on sama arvo kuin oldfd:llä, dup2() ei tee mitään ja palauttaa newfd:n.

Hankala käyttö dup2()-järjestelmäkutsulla:

Kuten dup2():ssa, newfd:n tilalle voidaan laittaa mikä tahansa tiedostokuvaaja. Alla on C-toteutus, jossa käytetään vakiotulosteen tiedostokuvaajaa (stdout). Tämä johtaa siihen, että kaikki printf()-käskyt kirjoitetaan tiedostoon, johon vanha tiedostokuvaaja viittaa.

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

Tämä näkyy alla olevassa kuvassa: Olkoon tiedosto 'tricky.txt' ennen dup2()-toimintoa alla olevan kuvan mukainen:

dup() ja dup2() Linux-järjestelmäkutsu

Yllä olevan C-ohjelman suorittamisen jälkeen tiedosto 'tricky.txt' on seuraavanlainen:

dup() ja dup2() Linux-järjestelmäkutsu Luo tietokilpailu