logo

Apel de sistem Linux dup() și dup2().

dup()

sortarea unui arraylist java

Apelul de sistem dup() creează o copie a unui descriptor de fișier.

  • Utilizează descriptorul neutilizat cu numărul cel mai mic pentru noul descriptor.
  • Dacă copia este creată cu succes, atunci descriptorii fișierului original și copiat pot fi folosiți interschimbabil.
  • Ambele se referă la aceeași descriere a fișierului deschis și, astfel, partajează decalajele fișierelor și steagurile de stare a fișierului.

Sintaxă:



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

Rețineți că acest program nu va rula în compilatorul online, deoarece include deschiderea unui fișier și scrierea pe el.

Explicaţie:

Open() returnează un descriptor de fișier file_desc la fișierul numit „dup.txt”. file_desc poate fi folosit pentru a efectua operații cu fișierul „dup.txt”. După utilizarea apelului de sistem dup(), este creată o copie a fișierului_desc. Această copie poate fi folosită și pentru a efectua operațiuni cu același fișier „dup.txt”. După două operații de scriere, una cu file_desc și alta cu copy_desc este editat același fișier, adică „dup.txt”. Înainte de a rula codul Fișierul „dup.txt” înainte de operația de scriere să fie așa cum se arată mai jos:

Apel de sistem Linux dup() și dup2().

După rularea programului C afișat mai sus, fișierul „dup.txt” este așa cum se arată mai jos:

Apel de sistem Linux dup() și dup2().

dup2()

Apelul de sistem dup2() este similar cu dup() dar diferența de bază dintre ele este că, în loc să folosească descriptorul de fișier neutilizat cu numărul cel mai mic, folosește numărul descriptorului specificat de utilizator.

Sintaxă:

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

Puncte importante:

  • Includeți fișierul antet unistd.h pentru utilizarea apelului de sistem dup() și dup2().
  • Dacă descriptorul newfd a fost deschis anterior, acesta este închis în tăcere înainte de a fi reutilizat.
  • Dacă oldfd nu este un descriptor de fișier valid, atunci apelul eșuează și newfd nu este închis.
  • Dacă oldfd este un descriptor de fișier valid și newfd are aceeași valoare ca oldfd, atunci dup2() nu face nimic și returnează newfd.

O utilizare dificilă a apelului de sistem dup2():

Ca și în dup2() în loc de newfd orice descriptor de fișier poate fi pus. Mai jos este o implementare C în care este utilizat descriptorul de fișier de ieșire standard (stdout). Acest lucru va conduce toate instrucțiunile printf() să fie scrise în fișierul referit de vechiul descriptor de fișier.

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

Acest lucru poate fi văzut în figura de mai jos: Fișierul „tricky.txt” înainte de operația dup2() să fie așa cum se arată mai jos:

Apel de sistem Linux dup() și dup2().

După rularea programului C afișat mai sus, fișierul „tricky.txt” este așa cum se arată mai jos:

Apel de sistem Linux dup() și dup2(). Creați un test