socket 子進程bind端口占用問題

發現一個socket參數可以在子進程運行的時候可以不繼承父進程(FORK)的句柄,父進程退出、子進程未退出的情況下,可以在下次父進程重新運行時,再次bind的時候不會失敗。

/* close server socket on exec so cgi's can't write to it*/
if (fcntl(server_s, F_SETFD, 1) == -1)
{
    msprintf("can't set close-on-exec on server socket!");
}

之前遇到的NVR RTSP重啓會提示554端口占用可以用這種解決辦法
(554端口占用問題,通過killall所有子進程的方式,避免了該問題)

// 和fcntl(server_s, F_SETFD, 1)等效,但這是標準寫法,即用 FD_CLOEXEC 取代直接寫1
int tFlags = fcntl(fd, F_GETFD);
fcntl(fd, F_SETFD, tFlags | FD_CLOEXEC);


msfs的disk之前也有這個問題,在open的時候加上O_CLOEXEC標誌。

以後創建句柄的時候可以設置一下這個值,這樣子進程纔不會有太多從父進程繼承的句柄,減少系統開銷。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章