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);C
oldfd: old file descriptor whose copy is to be created.
// 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:

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

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:

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