dup() ve dup2() Linux sistem çağrısı

dup() ve dup2() Linux sistem çağrısı

dup()

dup() sistem çağrısı, dosya tanımlayıcının bir kopyasını oluşturur.

  • Yeni tanımlayıcı için en düşük numaralı kullanılmayan tanımlayıcıyı kullanır.
  • Kopya başarıyla oluşturulduysa, orijinal ve kopya dosya tanımlayıcıları birbirinin yerine kullanılabilir.
  • Her ikisi de aynı açık dosya açıklamasına atıfta bulunur ve dolayısıyla dosya ofseti ve dosya durumu bayraklarını paylaşır.

Sözdizimi:

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

Bu programın, bir dosyayı açmayı ve üzerine yazmayı içerdiği için çevrimiçi derleyicide çalışmayacağını unutmayın.

Açıklama:

open(), 'dup.txt' adlı dosyaya dosya_desc dosya tanımlayıcısını döndürür. file_desc 'dup.txt' dosyasıyla bazı dosya işlemleri yapmak için kullanılabilir. Dup() sistem çağrısını kullandıktan sonra file_desc'in bir kopyası copy_desc oluşturulur. Bu kopya aynı 'dup.txt' dosyasıyla bazı dosya işlemleri yapmak için de kullanılabilir. Biri file_desc ve diğeri copy_desc ile yapılan iki yazma işleminden sonra aynı dosya düzenlenir, yani 'dup.txt'. Kodu çalıştırmadan önce, yazma işleminden önceki 'dup.txt' dosyası aşağıdaki gibi olsun:

dup() ve dup2() Linux sistem çağrısı

Yukarıda gösterilen C programını çalıştırdıktan sonra 'dup.txt' dosyası aşağıda gösterildiği gibidir:

dup() ve dup2() Linux sistem çağrısı

dup2()

dup2() sistem çağrısı dup()'a benzer ancak aralarındaki temel fark, en düşük numaralı kullanılmayan dosya tanımlayıcı yerine kullanıcı tarafından belirtilen tanımlayıcı numarasını kullanmasıdır.

Sözdizimi:

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

Önemli noktalar:

  • Dup() ve dup2() sistem çağrısını kullanmak için unistd.h başlık dosyasını ekleyin.
  • Newfd tanımlayıcısı daha önce açıksa, yeniden kullanılmadan önce sessizce kapatılır.
  • Eğer oldfd geçerli bir dosya tanımlayıcı değilse çağrı başarısız olur ve newfd kapatılmaz.
  • Eğer eskifd geçerli bir dosya tanımlayıcı ise ve yenifd, eskifd ile aynı değere sahipse, dup2() hiçbir şey yapmaz ve yenifd'yi döndürür.

dup2() sistem çağrısının zorlu bir kullanımı:

dup2()'de olduğu gibi newfd yerine herhangi bir dosya tanımlayıcı yerleştirilebilir. Aşağıda Standart çıktının (stdout) dosya tanımlayıcısının kullanıldığı bir C uygulaması verilmiştir. Bu, tüm printf() ifadelerinin eski dosya tanımlayıcı tarafından belirtilen dosyaya yazılmasına yol açacaktır.

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

Bunu aşağıdaki şekilde görebilirsiniz: Dup2() işleminden önceki 'tricky.txt' dosyası aşağıda gösterildiği gibi olsun:

dup() ve dup2() Linux sistem çağrısı

Yukarıda gösterilen C programını çalıştırdıktan sonra 'tricky.txt' dosyası aşağıda gösterildiği gibidir:

dup() ve dup2() Linux sistem çağrısı Test Oluştur