socket討論
(阿安, coolansean@yahoo.com.tw, 2012-02-07 13:59)
1樓
想請問一下,為啥開socket需要設定fcntl(server_s, F_SETFD, 1)??
新手請教,感謝~
(joseph, 2012-02-07 15:45)
2樓
就是在設定close-on-exec flag
如果換成這樣寫,也許比較好懂int flags = fcntl(fd, F_GETFD);
flags |= FD_CLOEXEC;
fcntl(fd, F_SETFD, flags);
(阿安, coolansean@yahoo.com.tw, 2012-02-07 16:30)
3樓
上網查了一下,但還是不太清楚設定的目的
是為了當程序執行exec,就要終止該程序??
我不太懂~
(joseph, 2012-02-08 12:18)
4樓
如果 parent process 對server_s 有設定
close-on-exec ,那麼
child process使用 exec() 前,就不用先自己去close server_s
Note: fork 會複製parent's file descriptor table
(阿安, coolansean@yahoo.com.tw, 2012-02-08 12:40)
5樓
感謝老師回答~
想問說為何需要設定close-on-exec??
為何當exec執行時要close掉該socket??
(joseph, 2012-02-09 14:10)
6樓
如果child process 沒有先做close FD/socket ,直接執行exec,
exec會換掉整個程式及資源, 資源也包含 FD table, 那這樣就沒有機會關FD/socket了.
便存在有一些FD沒有close..
每一個成功開啓的檔案/裝置,Kernel 都配置一個 file 結構以記錄相關檔案資訊
何時釋放此. file 結構 ? 當最後一個參考此
file
結構 的人,關閉(close)該檔案/裝置才會釋放,
即當參考次數(reference count) 為0 才釋放.
所以child process執行exec前,呼叫 close 才可以以維持 file資料結構的參考次數正確性.
當 file 結構釋放時,字元裝置Driver的 release method 也才會被呼叫
.
(阿安, coolansean@yahoo.com.tw, 2012-02-09 18:12)
7樓
非常感謝!!!
我搞懂了~