2012-01-03 10 views
12

"Sock", epfd tarafından atanmış bir epoll dosya tanıtıcısıyla önceden kaydedilmiş olan TCP soketinin bir tanıtıcısı olduğunda aşağıdaki kodu varsayalım.Bir soketi kapatmadan önce epoll 'den kaydını iptal etmek gerekli midir?

epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev); 
close(sock); 

o soket sonradan yine kapalı almak için gidiyor eğer epoll_ctl çağırmak hala gerekli mi? Ya da soket kapatılmasının bir sonucu olarak örtülü olarak kayıt altına alınır mı? man page itibaren

cevap

22

: hepsi epoll kaldırılacak neden

S6 otomatik olarak belirleyen bir dosya tanıtıcı kapanış mı? Evet, ancak aşağıdaki noktadan haberdar olun. Evet, ancak aşağıdaki noktaya dikkat edin. Bir dosya tanıtıcısı, bir açık dosya açıklamasına bir referansıdır (bkz. open (2)). Bir açıklayıcı aracılığıyla yineleniyor zaman dup (2), dup2 (2), fcntl (2) F_DUPFD veya fork (2), aynı açık dosya açıklaması atıfta yeni bir dosya tanımlayıcısı oluşturulur. Açık bir dosya açıklaması, kendisine başvuran tüm tanımlayıcıları kapatılıncaya kadar devam eder. Bir dosya tanımlayıcı kapatılmış altında yatan açık dosya açıklamasını atıfta tüm dosya tanımlayıcıları sonra sadece ayarlanmış bir epoll kaldırılır (veya açıklayıcısı açıkça kullanılarak kaldırılırsa önce epoll_ctl (2) EPOLL_CTL_DEL). Bu , epoll kümesinin bir parçası olan bir dosya tanımlayıcısının kümesinin kapalı olmasından sonra bile, aynı dosya açıklamasına başvuran diğer dosya tanımlayıcılarının açık kalması durumunda bu dosya tanıtıcısı için olayların bildirilebileceği anlamına gelir.

+0

Teşekkürler! Bir cevap aramak için "adam epoll_ctl", "adam epoll_create" yapmaya devam ettim, ama "adam epoll" için özet adam sayfası unuttum. – selbie

+0

Bu yüzden hiç kimse dup() ile çoğaltmayı başaramadı ve süreç çatallanmadı, iyi misiniz? – MarkR

+0

Evet, bunu güzelce özetliyor. –

İlgili konular