子进程中不需要的打开套接字

时间:2011-12-24 16:52:15

标签: perl sockets system parent-child

我有一个PERL脚本,它创建了很多套接字(大约700个套接字),然后用这些套接字填充。之后,它使用system(...)命令启动另一个应用程序,该应用程序打开更多套接字(如800左右),但由于每个进程的套接字数量限制为1024,我超出限制并且不要从套接字号1024及以后获取预期数据。

现在我的问题是:

  1. 系统命令是否使应用程序启动继承所有打开的文件描述符/套接字?
  2. 如果上述问题的答案是肯定的,那么还有其他方法可以启动另一个应用程序,以便启动的应用程序不会继承文件描述符吗?
  3. 如果2.的答案为否,那么有没有办法在子进程中关闭所有继承的文件描述符?

1 个答案:

答案 0 :(得分:3)

查看控制为close-on-exec设置哪些文件描述符的perlvar $^F。调用system()时,默认设置应该是关闭所有套接字描述符,但如果没有,可能$ ^ F未设置为您想要的。在Linux系统上告诉的一种非常快速简便的方法是在现有的system()调用之前尝试此调用:

system("ls -l /proc/self/fd");

ls的输出将显示执行“ls”命令时打开的文件。很可能你会看到只有stdin,stdout和stderr(描述符0,1和2)是打开的,但如果你看到你的套接字描述符打开,我会尝试设置$ ^ F = 2,看看是否有帮助。 / p>