2011-08-25 95 views
1

我有一个perl脚本调用fork()几次创建4个子进程。父进程然后使用waitpid()等待所有的孩子完成。Perl系统()命令失败后叉

当我尝试从子进程内调用system()(我使用它创建目录)时,会发生此问题。即使像系统一样简单(“dir”)失败(是的,我在Windows上)。

“失败”,我的意思是说,其中一个子线程越过它没有问题,但其他子进程,据我所知可以简单地停止存在。

trace INFO, "Thread $thread_id still alive at 2.62"; 
system("dir"); 
trace INFO, "Thread $thread_id still alive at 2.65"; 

我得到诸如“线程3仍然活着在2.62”的消息,但只有1个子线程达到2.65。

在日志的底部,我可以看到“命令以非零状态127退出”,我认为这可能与它有关。

我考虑过使用某种互斥锁来确保一次只有一个进程通过系统调用,但我怎么用fork()来做到这一点?另外,这个问题首先没有任何意义,为什么几个独立的进程在同一时间做系统(“dir”)有困难?

+1

你为什么使用'system()'创建目录? – TLP

+0

您使用的是哪个版本的perl?它是线程安全的吗? –

+0

您能否提供(最少量的)代码来重现我们运行的问题? – ikegami

回答

2

这里的问题是在windows下使用线程模拟fork()。所以没有创建真正的流程。

如果你是使用系统调用创建文件夹,那么你最好使用Perl函数mkdirFile::Pathmake_path代替。

+0

虽然每个线程都运行在它自己的CPU Core上,但这与此有关吗? (我有一个四核CPU,运行4个线程使其达到100%,而没有并行化的25%) – numegil

+0

线程共享内存。可能'系统'需要独占访问某些内部结构(但它是共享的,因为没有新的*进程*创建) –

+1

@Ivan Nevostruev,我不清楚你在说什么,但如果你说'系统'不会创建新的流程,这是错误的。 – ikegami