NS çift 2 () Sistem işlevi, mevcut bir dosya tanıtıcının bir kopyasını oluşturmak için kullanılır. Linux’ta 3 standart dosya tanımlayıcı vardır. bunlar:
Temel: Bu, standart girdi dosyası tanımlayıcısıdır. Terminalden girdi almak için varsayılan olarak kullanılır. tarama()Ve getc() işlevleri vb. kullanır Temel Kullanıcı girişi almak için dosya tanımlayıcı. NS Temel Dosya tanıtıcısı da bir sayı ile temsil edilir. 0.
Temel: Bu, standart çıktı dosyası tanımlayıcısıdır. Varsayılan olarak konsola/terminale bir şey yazdırmak için kullanılır. Yaygın olarak kullanılan Yazdır() işlev kullanımları Temel İstenen çıktıyı konsola/terminale yazdırmak için. NS Temel Dosya tanıtıcısı da bir sayı ile temsil edilir. 1.
Temel: Bu, standart hata dosyası tanımlayıcısıdır. ile aynı şeyi yapıyor Temel dosya tanımlayıcı NS Temel Dosya tanıtıcı, konsolda/terminalde hata mesajlarını yazdırmak için kullanılır. Tek fark, eğer kullanırsan Temel hata mesajlarını yazdırmak için dosya tanıtıcı ve
Temel normal çıktıyı yazdırmak için dosya tanıtıcı, daha sonra bunları ayırabilirsiniz. Örneğin, hata mesajlarını bir dosyaya ve normal çıktıyı konsola veya başka bir dosyaya iletebilirsiniz. NS Temel Dosya tanıtıcısı da bir sayı ile temsil edilir. 2.
Bu üç dosya tanımlayıcı dışında, C’de ek dosya tanımlayıcıları oluşturabilirsiniz. Yeni bir dosya tanımlayıcı oluşturmak için aşağıdakileri kullanabilirsiniz. aç() C.N.S’da çalışıyor aç() İşlev yeni bir dosya açar, o dosya için bir dosya tanımlayıcı oluşturur ve bunun dışına bir sayı ekler. 0Ve 1Ve 2 dosya tanıtıcısına.
ile bir dosya açarken aç() İşlevi kullanabilirsiniz. okuman () e yazmak() Yeni oluşturulan dosya tanımlayıcıyı okuma ve yazma işlevi.
Şimdi kullanarak belirli bir dosyadan okumak istediğiniz bir durum hayal edin. tarama() veya getc() ve işlevini kullanarak başka bir dosyaya yazın Yazdır() İşlev. Bu, varsayılan kullanıcı davranışı değildir. tarama()Ve getc() e Yazdır() daha önce açıkladığım gibi çalışır. Varsayılan olarak, tarama() e getc() işlev kullanımları Temel e Yazdır() kullanır Temel Bu işlevlere başka dosya tanıtıcıları kullanmalarını söylemenin bir yolu yoktur. Dolayısıyla, bu varsayılan davranışı değiştirmek için, Temel e Temel Dosya tanımlayıcıları İstediğiniz dosya tanımlayıcıları. bu ne çift 2 () sistem işlevselliği. NS çift 2 () İşlev, bir dosya tanımlayıcıyı başka bir dosya tanımlayıcıya kopyalar.
dup2() sözdizimi ve dönüş değeri:
sözdizimi çift 2 () İşlev:
int çift 2(int eski_dosya_tanımlayıcıVeint yeni_dosya_tanımlayıcı);
çift 2 () işlevsel kopyalama eski_dosya_tanımlayıcı içeri yeni_dosya_tanımlayıcı. eğer yeni_dosya_tanımlayıcı Zaten varsa, otomatik olarak kapanacaktır. eski_dosya_tanımlayıcı ona kopyala.
başarı üzerine, çift 2 () İşlev, yeni dosya tanıtıcısını döndürür. bir hata oluşursa, çift 2 () verim -1.
NS çift 2 () İşlev, başlık dosyasında tanımlanır unistd.h.
adresi eklemelisiniz unistd.h kullanılacak C kaynak dosyasında çift 2 () Aşağıdaki gibi çalışır:
Daha fazla bilgi için man sayfasına göz atın. çift 2 () Aşağıdaki komutla:
Örnek 1:
Yeni bir C kaynak dosyası oluşturun 01_dup2.c Ve aşağıdaki kod satırlarını dosyaya yazın.
#birleştirmek için
#birleştirmek için
#birleştirmek için
int o(Geçersiz){
int 1 numaraVe 2 numaraVe toplam;
int giriş = aç(“./input.txt”Ve SADECE O_RD);
eğer(çift 2(girişVe STDIN_FILENO)<0){
Baskı(“Dosya tanıtıcı kopyalanamadı.”);
çıkış(EXIT_FAILURE);
}
tarama yapıldı(“%d%d”Ve&1 numaraVe&2 numara);
toplam = 1 numara + 2 numara;
Baskı(%d + %d = %d\n“Ve 1 numaraVe 2 numaraVe toplam);
dönüş ÇIKIŞ_BAŞARI;
}
Şimdi, yeni bir dosya oluşturun oturum aç.txt Aynı dizinde ve içine aşağıdaki satırı yazın.
Bu programın temel amacı iki tam sayıyı okumaktır. oturum aç.txt dosyayı kullanma tarama() fonksiyon, ekleyin ve toplamı yazdırın.
Öncelikle aşağıdaki kod satırları ile gerekli header dosyalarını ekledim.
#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için
içeri O.O() Fonksiyonda gerekli değişkenleri tanımladınız.
int 1 numaraVe 2 numaraVe toplam;
sonra dosyayı açtım oturum aç.txt salt okunur modda (SADECE O_RD) kullanmak aç() Bir değişkende saklanan işlev ve dosya tanımlayıcı giriş.
int giriş = aç(“./input.txt”Ve SADECE O_RD);
Bir dosya tanıtıcım olduğunda oturum aç.txt Dosya tanımlayıcısını standart giriş dosyası tanımlayıcısına kopyaladım. STDIN_FILENO (0) kullanarak çift 2 () İşlev. dosya tanımlayıcı oturum aç.txt Şimdi varsayılan Temel dosya tanımlayıcı
çift 2(girişVe STDIN_FILENO)
ben de yazabilirim çift 2 () Aşağıdaki gibi çalışır. Sonuç aynı olacaktır. STDIN_FILENO değeri korur 0Değerli Temel dosya tanımlayıcı
ben de kontrol ettim çift 2 () Aşağıdaki satırlardaki hatalar. Bir hata oluşursa, program bir hata mesajı yazdıracak ve çıkacak şekilde ayarlanmıştır.
eğer(çift 2(girişVe STDIN_FILENO)<0){
Baskı(“Dosya tanıtıcı kopyalanamadı.”);
çıkış(EXIT_FAILURE);
}
Sonra alıştım tarama() 2 numarayı temizlemek için oturum aç.txt bir dosya.
tarama yapıldı(“%d%d”Ve&1 numaraVe&2 numara);
Sonra sayıları ekledim ve toplamı varsayılan olarak konsola/istasyona yazdırdım. Temel.
toplam = 1 numara + 2 numara;
Baskı(%d + %d = %d\n“Ve 1 numaraVe 2 numaraVe toplam);
Gördüğünüz gibi programı çalıştırdığımda beklenen çıktıyı aldım.
İkinci örnek:
Yeni bir C kaynak dosyası oluşturun 02_dup2.c Ve aşağıdaki kod satırlarını dosyaya yazın.
#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için
#birleştirmek için
int o(Geçersiz){
int 1 numaraVe 2 numaraVe toplam;
int giriş = aç(“./input.txt”Ve SADECE O_RD);
int çıktı_fds = aç(“./output.txt”Ve O_YANLIŞ | O_CREATEVe S_IRUSR | S_IWUSR);
çift 2(girişVe STDIN_FILENO);
çift 2(çıktı_fdsVe STDOUT_FILENO);
tarama yapıldı(“%d%d”Ve&1 numaraVe&2 numara);
toplam = 1 numara + 2 numara;
Baskı(%d + %d = %d\n“Ve 1 numaraVe 2 numaraVe toplam);
dönüş ÇIKIŞ_BAŞARI;
}
Şimdi, yeni bir dosya oluşturun oturum aç.txt Aynı dizinde ve içine aşağıdaki satırı yazın.
Bu programda da aynısını yaptım. örnek 1. Tek fark, yeni bir dosya oluşturmam. çıktı output.txt dosya tanıtıcısını varsayılan olarak kullanın Temel bir dosya tanımlayıcı kullanarak çift 2 () İşlev. Artık tüm çıktılar Yazdır() fonksiyon yazılacak çıktı bir dosya.
Yeni bir dosya ve dosya tanımlayıcı oluşturdunuz çıktı_fds Çalışan.
int çıktı_fds = aç(“./output.txt”Ve O_YANLIŞ | O_CREATEVe S_IRUSR | S_IWUSR);
Ayrıca output_fds dosya tanımlayıcısını stdout dosya tanımlayıcısına da kopyaladım. Önceden tanımlanmış sabiti kullandım STDOUT_FILENO.
çift 2(çıktı_fdsVe STDOUT_FILENO);
STDOUT_FILENO değeri içerir 1 (varsayılan dosya tanımlayıcı değeri Temel). Böylece, dup2() işlev çağrısını aşağıdaki gibi yeniden yazabilirim. Aynı sonuçları verecektir.
Programın geri kalanı aynıdır. Gördüğünüz gibi programı çalıştırdığımda konsolda/terminalde hiçbir şey yazdırmıyor.
Ancak, program yeni bir dosya oluşturmuştur. çıktı bir dosya.
Gördüğünüz gibi çıktı dosyaya yazılıyor. çıktı.
Tüm hataları yazmak isterseniz (Temel) başka bir dosyaya kopyalayın ve ardından dosya tanıtıcıyı da kopyalayın. Temel Dosya tanımlayıcısı aşağıdaki gibidir.
çift 2(hata_fdsVe STDERR_FILENO);
Yani, onu böyle kullanıyorsun çift 2 () C’de Sistem Çağrısı Bu makaleyi okuduğunuz için teşekkürler.
Diğer gönderilerimize göz at
[wpcin-random-posts]
İlk Yorumu Siz Yapın