FD_CLOEXEC fcntl () bayrağı ne işe yarar?


82

Şöyle:

Okumama rağmen man fcntlne işe yaradığını anlayamıyorum.

Yanıtlar:


74

Bu ayarlar yakın-on-exec herhangi zaman dosya tanımlayıcı otomatik (ve atomik) olmak kapalı neden olur dosya tanımlayıcı için bayrak exec-ailesi fonksiyonlar başarılı.

Ayrıca, işlemin başarısız olup olmadığını görmek için dönüş değerini de test eder; bu, bu işlemin geçerli bir dosya tanımlayıcısında başarısız olması için herhangi bir koşul olmadığından, dosya tanımlayıcısı geçerliyse faydasızdır.


4
FILE *Dosya tanımlayıcısıyla ilişkili herhangi bir dosya akışını ( ) temizlemekle ilgili hiçbir şey yapmadığını unutmayın . FD_CLOEXEC için geçerli bir kullanım, bir kabuk işlemini yürütürken ana işlemin açtığı bir günlük dosyasını kapatmaktır. POSIX 2008'in open(2)O_CLOEXEC için bir seçeneğe sahip olduğuna dikkat edin - bu nedenle bu özelliği dosyayı açtığınızda ayarlayabilirsiniz, bu da yaygın olarak kullanılabilir olduğunda çok yararlı olacaktır.
Jonathan Leffler

Dosya açıldığında bayrağı atomik olarak ayarlamak, başka bir iş parçacığı harici programları çalıştırırken dosyaları açan herhangi bir iş parçacığına sahip program için oldukça önemlidir. Ne yazık ki için sadece ulaşılabilir opendeğil accept, socket, pipe, vb ...
R .. GitHub DUR YARDIMCI ICE

Evet - O_CLOEXEC veya eşdeğerini diğer dosya tanımlayıcı oluşturma işlevlerine ekleyen tasarım sorunları var (tabii ki etkilenmez dup()ve dup2()etkilenmez). Muhtemelen fazladan bir 'mod' veya 'bayraklar' parametresine sahip yeni işlevlere sahip olmanız gerekecekti, muhtemelen bu yüzden olmadı. Soket üzerinde O_CLOEXEC kullanabilseydiniz, accept()bu bayrağı döndürdüğü tanımlayıcıda klonlayacağını varsayabilirsiniz . Ama socket()ve pipe()daha zordur.
Jonathan Leffler

3
dupve dup2etkilenir. Yürütme sırasında kapat işareti dosya tanımlayıcıları için geçerlidir, dosya açıklamaları için geçerli değildir, bu nedenle yinelenen dosya tanımlayıcıları arasında paylaşılmaz. Bu çok iyi bir şey.
R .. GitHub BUZA YARDIM ETMEYİ DURDUR

3
Yorumlarında konuşma takibi, POSIX eksiklikleri gidermeye sonraki konu yeni arayüzler dahil edilmek üzere kabul etmiştir: dup3, pipe2, ve accept4. Ayrıca istenen soket tipi ile birleştirebileceğiniz bayrağa socketsahiptir SOCK_CLOEXEC.
R .. GitHub BUZA YARDIM ETMEYİ DURDUR

33

Dosya tanımlayıcısını işaretler, böylece close()süreç veya herhangi bir çocuk işlev ailesinden fork()birini çağırdığında otomatik olarak d olacaktır exec*(). Bu, dosya tanımlayıcılarınızı örn system(). Tarafından çalıştırılan rastgele programlara sızdırmamak için kullanışlıdır .


Bu bir güvenlik sorunu mu?
zach

1
@zach öyle diyebilirsin; Ancak, dağınık bir mantığı tek bir varlığa kapsüllemek gibi gerçekten yaptığınız herhangi bir yeniden düzenleme, "güvenlik endişesi" olarak adlandırılabilir, çünkü o varlığın yanlış kullanımı nedeniyle hata olasılığını azaltır ve "hata" soyut bir şeydir bu özellikle segmentleri ve bilgi sızıntılarını içerir.
Hi-Angel

Bu yüzden bazı soket kodunu yeniden düzenliyorum ve soketi alma ile uzak sunucuya bağlanma arasında, FD_CLOEXEC bayrağını soketin FD'sine eklemek için F_SETFD kullanıyorlar. Başarılı bir bağlantıdan sonra FD_CLOEXEC kaldırılır. Bu kod alanına dahil olan herhangi bir exec () çağrısı bulamıyorum ve bunların kaldırılması gereken ancak kaldırılmayan eski kod kalıntıları olup olmadıklarını merak ediyorum. Tüm bunların amacını bulmak için neye bakmanız gerektiğinden emin değilim.
JoeManiaci
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.