【问题标题】:Perl system() command failing after forkfork 后 Perl system() 命令失败
【发布时间】:2011-11-04 02:27:47
【问题描述】:

我有一个 perl 脚本,它调用 fork() 几次来创建 4 个子进程。然后父进程使用 waitpid() 等待所有子进程完成。

当我尝试从子进程中调用 system() 时出现问题(我正在使用它来创建目录)。即使像 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。

在日志的底部,我可以看到“Command exited with non-zero status 127”,我认为这可能与它有关。

我考虑过使用某种互斥锁来确保一次只有 1 个进程通过系统调用,但是我如何使用 fork() 来做到这一点?另外,这个问题本来就没有任何意义,为什么几个独立的进程同时执行 system("dir") 会有问题?

【问题讨论】:

  • 为什么要使用system() 创建目录?
  • 你使用的是什么版本的 perl?它是线程安全的吗?
  • 您能否提供(最少的)重现问题的代码供我们运行?

标签: perl system fork parallel-processing


【解决方案1】:

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

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

【讨论】:

  • 每个线程都在自己的 CPU 内核上运行,这是否相关? (我有一个四核 CPU,运行 4 个线程使其达到 100%,而不是没有并行化的 25%)
  • 线程共享内存。可能system 需要独占访问某些内部结构(但它是共享的,因为没有创建新的进程
  • @Ivan Nevostruev,我不清楚你在说什么,但如果你说system 没有创建新进程,那就错了。
  • @ikegami 我不太确定 perl system 在 Windows 下如何工作。但在某些时候它会调用 WinAPI。看起来 WinAPI,perl 调用,不是线程安全的。这就是为什么我要求 OP 使用的 perl 版本。
  • 我正在使用 Perl v5.12.4。使用 mkdir 而不是 system 似乎工作正常。不知道为什么首先使用系统,这不是我的代码。
猜你喜欢
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 2012-10-22
  • 2012-07-21
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多