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:
![]()
Yukarıda gösterilen C programını çalıştırdıktan sonra 'dup.txt' dosyası aşağıda gösterildiği gibidir:
![]()
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:
Yukarıda gösterilen C programını çalıştırdıktan sonra 'tricky.txt' dosyası aşağıda gösterildiği gibidir:
Test Oluştur