[网络通讯]使用fork的TCP通讯服务端重起bind问题

现象:服务器

socket服务器,对每一个链接fork一个子进程进行处理,此时服务器重起,虽然设置了SO_REUSEADDR,可是仍然bind失败。ssh

缘由分析:socket

一、fork后,用于LISTEN的socket,也会被子进程继承,状态也是处于LISTEN状态。因此服务重起后bind失败。继承

二、能够在子进程中主动将LISTEN的socket关闭。(由于fork后并无调用exec,因此设置的FD_CLOEXEC并不会起做用。)进程

三、例如,sshd服务就能够在服务的子进程工做时,重起sshd仍然会成功。 使有strace -f -p pid 跟踪了一下, 子进程中有close LISTEN socket的操做。bind

相关文章
相关标签/搜索