知識社群登入
位置: 艾鍗學院 Blog > 專業論壇 > 討論
socket討論
1樓
想請問一下,為啥開socket需要設定fcntl(server_s, F_SETFD, 1)??

新手請教,感謝~
2樓

就是在設定close-on-exec flag
如果換成這樣寫,也許比較好懂
int flags = fcntl(fd, F_GETFD);  
flags |= FD_CLOEXEC;  
fcntl(fd, F_SETFD, flags);
3樓
上網查了一下,但還是不太清楚設定的目的

是為了當程序執行exec,就要終止該程序??

我不太懂~
4樓
 如果 parent process 對server_s 有設定  close-on-exec ,那麼
 child process使用 exec() 前,就不用先自己去close server_s

Note: fork 會複製parent's file descriptor table




5樓
感謝老師回答~

想問說為何需要設定close-on-exec??

為何當exec執行時要close掉該socket??
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 也才會被呼叫 

 .


7樓
非常感謝!!!

我搞懂了~