发现一个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标志。
以后创建句柄的时候可以设置一下这个值,这样子进程才不会有太多从父进程继承的句柄,减少系统开销。