【发布时间】:2014-11-27 22:15:40
【问题描述】:
- 我有一个程序,它
popen()到另一个程序,还有dup()标准输出 - 当从另一个进程(如 PHP 示例)或通过 SSH 调用时,该进程不会退出。
process_test.c:
#include <stdio.h>
#include <unistd.h>
int main() {
int out;
out = dup(STDOUT_FILENO);
// close(out);
popen("sleep 10\0", "r");
}
用gcc process_test.c编译,用:运行:
-
./a.out-> 正常退出 -
ruby -e 'system("./a.out");'-> 正常退出 -
php -r passthry("./a.out");-> 挂起 -
ssh remotehost ./a.out-> 挂起 - 当我不
dupstdout 或关闭 dup 时,它不会挂起
这是我能找到的最短的可重现代码,它向我展示了我希望更好地理解的行为。
使用 fork/pcntl/etc 从多个 PHP 应用程序/框架中提取它需要几个小时。来衡量他们的关系,即我没有写这个或编造这个;但很明显,由于我把所有东西都拆了,它的整体感觉就消失了。
问题
- 为什么有些调用会挂起(php、ssh)而有些则不会(ruby)?
- 即使我关闭 fd 在 popen 之后,我的程序也会挂起;为什么?
【问题讨论】: