dup() a dup2() systémové volání Linuxu
dup()
Systémové volání dup() vytvoří kopii deskriptoru souboru.
- Pro nový deskriptor používá nepoužitý deskriptor s nejnižším číslem.
- Pokud je kopie úspěšně vytvořena, lze deskriptory původního a kopírovaného souboru používat zaměnitelně.
- Oba odkazují na stejný popis otevřeného souboru, a tak sdílejí offset souboru a příznaky stavu souboru.
Syntax:
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 ; } Všimněte si, že tento program se nespustí v online kompilátoru, protože zahrnuje otevření souboru a zápis do něj.
Vysvětlení:
Open() vrací deskriptor souboru file_desc do souboru s názvem 'dup.txt'. file_desc lze použít k provedení některých operací se souborem 'dup.txt'. Po použití systémového volání dup() se vytvoří kopie file_desc copy_desc. Tuto kopii lze také použít k provedení některých operací se souborem se stejným souborem 'dup.txt'. Po dvou operacích zápisu, jedna s file_desc a druhá s copy_desc se upraví stejný soubor, tj. 'dup.txt'. Před spuštěním kódu Nechte soubor 'dup.txt' před operací zápisu vypadat následovně:
![]()
Po spuštění programu C zobrazeného nad souborem 'dup.txt' vypadá takto:
![]()
dup2()
Systémové volání dup2() je podobné jako dup(), ale základní rozdíl mezi nimi je v tom, že namísto použití nejnižšího nepoužitého deskriptoru souboru používá číslo deskriptoru určené uživatelem.
Syntax:
int dup2(int oldfd int newfd);
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.Důležité body:
- Zahrňte hlavičkový soubor unistd.h pro použití systémového volání dup() a dup2().
- Pokud byl deskriptor newfd dříve otevřený, je před opětovným použitím tiše uzavřen.
- Pokud oldfd není platným deskriptorem souboru, pak se volání nezdaří a newfd se neuzavře.
- Pokud je oldfd platným deskriptorem souboru a newfd má stejnou hodnotu jako oldfd, pak dup2() nedělá nic a vrací newfd.
Záludné použití systémového volání dup2():
Stejně jako v dup2() lze místo newfd vložit libovolný deskriptor souboru. Níže je implementace C, ve které je použit deskriptor souboru standardního výstupu (stdout). To povede k tomu, že všechny příkazy printf() budou zapsány do souboru odkazovaného starým deskriptorem souboru.
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 ; }
To je vidět na obrázku níže: Nechť soubor 'tricky.txt' před operací dup2() vypadá následovně:
Po spuštění programu C zobrazeném nad souborem 'tricky.txt' je znázorněno níže:
Vytvořit kvíz