【发布时间】:2013-05-06 03:41:35
【问题描述】:
我的应用程序使用 QuickTime 框架通过fork() 和管道启动一个子进程程序来读取视频。子进程在不忙时进入等待循环,即它执行usleep 直到有输入。子进程不是 GUI 应用程序,它是用 C++ 编写的。
打开使用 MSVC 编解码器编码的 AVI 视频时,应用程序图标的第二个副本会显示在 Dock 中并反弹。在活动监视器中大约 30 秒后,我可以看到子进程变为“无响应”,即使 CPU 似乎为 ~0%。子进程仍在运行并响应;只是活动监视器另有说明。
如果我查看子进程的状态,通过gdb attach 或检查其输出;一切看起来都很好。我可以告诉子进程关闭文件并打开另一个文件并继续使用它,此时弹跳停靠图标消失并且进程未标记为无响应。
就好像 OSX 认为我的子进程已经崩溃(?)但我无法检测到异常。
如何停止子进程在 Dock 中显示图标、弹跳并被标记为无响应?
这是我与子进程建立通信的方式:
#include <unistd.h>
#define READ 0
#define WRITE 1
// Start process
pid_t popen2(const char *command, char * const argv[], int *infp, int *outfp)
{
int p_stdin[2], p_stdout[2];
pid_t pid;
// Set up pipes
if(pipe(p_stdin) != 0 || pipe(p_stdout) != 0)
return(-1);
pid = fork();
if(pid < 0)
return(pid);
else if(pid == 0)
{
// Set up communication via stdin/out
close(p_stdin[WRITE]);
dup2(p_stdin[READ], READ);
close(p_stdout[READ]);
dup2(p_stdout[WRITE], WRITE);
execvp(command, argv); // run subprocess
perror("execvp");
exit(1);
}
// Provide pointers to the file descriptors to the caller
if(infp == NULL)
close(p_stdin[WRITE]);
else
*infp = p_stdin[WRITE];
if(outfp == NULL)
close(p_stdout[READ]);
else
*outfp = p_stdout[READ];
return(pid);
}
有关popen2()的更多讨论,请参阅this SO question。
注意:此代码可能是也可能不是我的问题的原因。作为第一步,我真的很想证明是什么原因。
【问题讨论】:
-
向我们展示一些代码(并告诉我们“某些特定数据”的含义)。
-
什么部分的代码?子流程使用 QuickTime 框架。当使用 MSVC 编解码器打开一些 AVI 时,我可以观察到所描述的行为。我怀疑 QuickTime 可以 识别的其他一些编解码器也会导致图标弹跳/无响应。
-
我很难知道代码的哪一部分是相关的,但是有一些代码——它的任何部分——可能会有所帮助。我在这里有一台 OS X 计算机,但我无法解决这个问题(事实上,问题是什么??)。
-
子进程不应获得停靠图标(弹跳或其他方式),并且不应将其标记为在响应所有意图和目的时未响应。我的问题是如何阻止这种行为?
-
例如,您还没有告诉我们您使用什么机制或 API 来生成子进程。这不是一个真正的问题。