记一次 system() 引起的端口抢占
写在前面在写代码时,难免需要调用别的命令获取一些信息,这时可以用popen()拿到需要的信息;有时又需要启动其他服务,这时可能会用system()直接调用启动该服务的命令。这次要说的,就是用system()函数调用 daemon 进程可能会引起的问题。
现象描述最近在项目中加入了一个程序A,监听 5081 端口,用于设备间通信。当收到特定的消息时,就会通过 rsync 将指定设备的一些文件拷贝到本机,再重启一些进程。有时就会发现,在重启这些进程的时候,5081 端口可能就会被 B,C,D 进程占用(不是必现,但是很容易复现,而且一定是这几个进程占用)。开始怀疑可能是进程A挂了,被monitor(系统中一个监控各进程生死的脚本)重启了,但是多次发现后确认进程A自始至终没有挂过。还有一个情况是进程 B,C,D 的代码中,并没有监听 5081 端口,有的是监听别的已指定的端口,有的根本则不需要监听端口。而且当进程 A 被杀掉后 B,C,D 必然会监听 5081 端口。
问题分析发现问题后,也没什么眉目,和大家讨论了不少,大家觉得最不可思议的就是,A进程既然没有挂,为何B,C,D进程就能抢到A
...