现象:
socket服务器,对每个连接fork一个子进程进行处理,此时服务器重起,虽然设置了SO_REUSEADDR,但是仍然bind失败。
原因分析:
1、fork后,用于LISTEN的socket,也会被子进程继承,状态也是处于LISTEN状态。所以服务重起后bind失败。
2、可以在子进程中主动将LISTEN的socket关闭。(因为fork后并没有调用exec,所以设置的FD_CLOEXEC并不会起作用。)
3、例如,sshd服务就可以在服务的子进程工作时,重起sshd仍然会成功。 使有strace -f -p pid 跟踪了一下, 子进程中有close LISTEN socket的操作。