logo

dup() un dup2() Linux sistēmas izsaukums

dup ()

Sistēmas izsaukums dup() izveido faila deskriptora kopiju.

  • Jaunajam deskriptoram tiek izmantots neizmantotais deskriptors ar mazāko numuru.
  • Ja kopija ir veiksmīgi izveidota, oriģinālā un kopijas faila deskriptorus var izmantot aizvietojami.
  • Tie abi attiecas uz vienu un to pašu atvērtā faila aprakstu un tādējādi koplieto failu nobīdes un faila statusa karogus.

Sintakse:



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

Ņemiet vērā, ka šī programma nedarbosies tiešsaistes kompilatorā, jo tā ietver faila atvēršanu un rakstīšanu uz tā.

Paskaidrojums:

Open() atgriež faila deskriptoru file_desc failam ar nosaukumu "dup.txt". file_desc var izmantot, lai veiktu dažas darbības ar failu ar failu "dup.txt". Pēc sistēmas dup() izsaukuma izmantošanas tiek izveidota faila file_desc kopija copy_desc. Šo kopiju var izmantot arī, lai veiktu dažas darbības ar failu ar to pašu failu “dup.txt”. Pēc divām rakstīšanas darbībām viena ar failu_desc un otra ar copy_desc tiek rediģēta, t.i., "dup.txt". Pirms koda palaišanas Ļaujiet failam "dup.txt" pirms rakstīšanas darbības parādīties šādi:

dup() un dup2() Linux sistēmas izsaukums

Pēc C programmas palaišanas fails "dup.txt" ir šāds:

dup() un dup2() Linux sistēmas izsaukums

dup2()

Sistēmas izsaukums dup2 () ir līdzīgs dup (), taču galvenā atšķirība starp tiem ir tāda, ka tā vietā, lai izmantotu neizmantotā faila deskriptoru ar mazāko numuru, tas izmanto lietotāja norādīto deskriptora numuru.

Sintakse:

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

Svarīgi punkti:

  • Iekļaujiet galvenes failu unistd.h, lai izmantotu sistēmas izsaukumu dup() un dup2().
  • Ja deskriptors newfd iepriekš bija atvērts, tas tiek klusi aizvērts pirms atkārtotas izmantošanas.
  • Ja oldfd nav derīgs faila deskriptors, izsaukums neizdodas un newfd netiek aizvērts.
  • Ja oldfd ir derīgs faila deskriptors un newfd ir tāda pati vērtība kā oldfd, tad dup2() neko nedara un atgriež newfd.

Sarežģīta dup2() sistēmas izsaukuma izmantošana:

Tāpat kā dup2() newfd vietā var ievietot jebkuru faila deskriptoru. Zemāk ir C ieviešana, kurā tiek izmantots standarta izvades faila deskriptors (stdout). Tādējādi visi printf() priekšraksti tiks ierakstīti failā, uz kuru atsaucas vecais faila deskriptors.

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 var redzēt attēlā, kas parādīts zemāk: Ļaujiet failam "tricky.txt" pirms dup2() darbības, kā parādīts zemāk:

dup() un dup2() Linux sistēmas izsaukums

Pēc C programmas palaišanas, kas parādīta iepriekš, fails “tricky.txt” ir šāds:

dup() un dup2() Linux sistēmas izsaukums Izveidojiet viktorīnu