我的应用程序启动了一个子进程程序,以使用 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);
}
有关更多讨论,请参阅此 SO 问题popen2()
。
注意:此代码可能是也可能不是我的问题的原因。作为第一步,我真的很想证明是什么原因。