2011-12-24 84 views
1

我有一个创建大量套接字(大约700个套接字)的PERL脚本,然后用这些套接字做东西。之后,它使用system(...)命令启动另一个应用程序,该应用程序可以打开更多的套接字(例如800左右),但由于每个进程的套接字数量限制为1024,因此我超出了限制,并且没有从中获得预期数据插座号码1024及以上。在子进程中不需要的打开套接字

现在我的问题是这样的:

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

假设这是一个类UNIX系统,每用户fd限制是多少? – pilcrow

+0

每个用户是否有限制?我不知道... 每个进程的限制设置为1024(所以0到1023工作正常,并且1024失败)... – mtahmed

+0

我的意思是用户的进程可能有一个资源限制低于系统。你可以在system()之前打印'$^F'吗?你可以试试'system('ulimit -n; exec your_command ...')'来查看当前的限制吗? – pilcrow

回答

3

查看perlvar $^F,它控制哪些文件描述符设置为执行关闭。当您调用system()时,默认设置应该关闭所有套接字描述符,但如果没有,可能$^F没有设置为您想要的。一个非常快速简便的方法来告诉Linux系统上的就只是将现有的系统()调用之前有权试试这个电话:

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

的LS的输出会告诉你哪些文件被留下当打开“ ls“命令被执行。很可能你会看到只有stdin,stdout和stderr(描述符0,1和2)是打开的,但是如果你看到你的套接字描述符打开,我会尝试设置$^F = 2,看看是否有帮助。

+0

好的,我会在28日尝试这个......谢谢 – mtahmed

+0

出于好奇...只是另一个问题......你知道如何关闭在C子进程中打开套接字吗? – mtahmed

+0

当然,假设你无法弄清楚为什么关闭执行不起作用(我认为仍然是最好的第一种方法),你可以强制一切,但stdin,stdout和stderr这样关闭:'for(my $ fd = 3; $ fd <1024; $ fd ++){ close(F)if open(F,“<&= $ fd”); } ' – andy

相关问题