dup() и dup2() системно извикване на Linux
дуп ()
Системното извикване dup() създава копие на файлов дескриптор.
- Той използва неизползвания дескриптор с най-нисък номер за новия дескриптор.
- Ако копието е създадено успешно, дескрипторите на оригиналния и копирания файл могат да се използват взаимозаменяемо.
- И двете препращат към едно и също описание на отворен файл и по този начин споделят флагове за отместване на файла и състояние на файла.
Синтаксис:
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 ; } Имайте предвид, че тази програма няма да работи в онлайн компилатора, тъй като включва отваряне на файл и писане върху него.
Обяснение:
Open() връща файлов дескриптор file_desc към файла с име „dup.txt“. file_desc може да се използва за извършване на някаква файлова операция с файл 'dup.txt'. След използване на системното извикване dup() се създава копие на file_desc copy_desc. Това копие може също да се използва за извършване на файлова операция със същия файл 'dup.txt'. След две операции за запис, една с file_desc и друга с copy_desc, същият файл се редактира, т.е. „dup.txt“. Преди стартиране на кода Нека файлът 'dup.txt' преди операцията за запис да бъде както е показано по-долу:
![]()
След стартиране на C програмата, показана по-горе, файлът „dup.txt“ е както е показано по-долу:
![]()
dup2()
Системното извикване dup2() е подобно на dup(), но основната разлика между тях е, че вместо да използва неизползвания файлов дескриптор с най-нисък номер, той използва номера на дескриптора, зададен от потребителя.
Синтаксис:
int dup2(int oldfd int newfd);
oldfd: old file descriptor
newfd new file descriptor which is used by dup2() to create a copy.Важни точки:
- Включете заглавния файл unistd.h за използване на системно извикване dup() и dup2().
- Ако дескрипторът newfd е бил преди това отворен, той се затваря тихо, преди да бъде използван повторно.
- Ако oldfd не е валиден файлов дескриптор, тогава извикването е неуспешно и newfd не се затваря.
- Ако oldfd е валиден файлов дескриптор и newfd има същата стойност като oldfd, тогава dup2() не прави нищо и връща newfd.
Трудно използване на системно извикване dup2():
Както в dup2() на мястото на newfd може да се постави произволен файлов дескриптор. По-долу е реализация на C, в която се използва файловият дескриптор на стандартния изход (stdout). Това ще накара всички оператори printf() да бъдат записани във файла, посочен от стария файлов дескриптор.
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 ; }
Това може да се види на фигурата, показана по-долу: Нека файлът 'tricky.txt' преди операцията dup2() да бъде както е показано по-долу:
След стартиране на C програмата, показана по-горе, файлът "tricky.txt" е както е показано по-долу:
Създаване на тест