前面多进程测试时发现两个问题:
1.如果不在fork后的进程执行关闭对方socket对象,会如何?
该问题仅通过这里的脚本测试并无异常出现,但从后台进程仍看出一些区别,如下是启动一个client后的服务端进程
#lsof -Pnl +M -i4 | grep 65432
perl 5530 500 3u IPv4 18424 TCP *:65432 (LISTEN)
perl 5533 500 3u IPv4 18424 TCP *:65432 (LISTEN)
perl 5533 500 4u IPv4 18425 TCP 192.168.10.15:65432->192.168.10.16:52494 (ESTABLISHED)
可以看到,父进程5530 仅包含一个监听,但子进程5533却多出一个监听,这应该是由于子进程中未执行关闭监听导致。虽然,子进程存在监听,但由于子进程进入连接循环后不再响应监听,所以对我们的测试并无影响。至于在更高级的应用里有什么影响,现在还不清楚?
2.父进程异常中断后会发生什么情况?
父进程执行后占据控制台,假如键盘按Ctrl+C中断进程,这时父进程被终止退出,但我们在客户端上可以输入并得到回显。查看端口发现,后台仍有ESTABLISHED的连接,但是LISTEN状态的消失了。而LISTEN正对应着父进程,也就是父进程退出,原来的子进程仍在后台,查看进程果然后台有,该子进程的父进程号变为1。
修改server程序,在信号INT处理匿名函数中添加如下:
$SIG{INT} = sub { $quit++; exit 0 };
这时父进程被中断,子进程同样收到该信号并退出。