Şöyle:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Okumama rağmen man fcntlne işe yaradığını anlayamıyorum.
Şöyle:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Okumama rağmen man fcntlne işe yaradığını anlayamıyorum.
Yanıtlar:
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.
opendeğil accept, socket, pipe, vb ...
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.
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.
dup3, pipe2, ve accept4. Ayrıca istenen soket tipi ile birleştirebileceğiniz bayrağa socketsahiptir SOCK_CLOEXEC.
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 .
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'inopen(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.