概述
发现一个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标志。
以后创建句柄的时候可以设置一下这个值,这样子进程才不会有太多从父进程继承的句柄,减少系统开销。
最后
以上就是幽默饼干为你收集整理的socket 子进程bind端口占用问题的全部内容,希望文章能够帮你解决socket 子进程bind端口占用问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复