【发布时间】:2019-07-07 06:45:17
【问题描述】:
我正在使用 C 语言开发基于 ncurses 的文件管理器。问题是某些子进程可能需要一些时间才能完成,并且在此之前由于waitpid 而它仍然卡住。
我不能使用WNOHANG 标志,因为下一个代码块取决于子进程的输出。
void getArchivePreview(char *filepath, int maxy, int maxx)
{
pid_t pid;
int fd;
int null_fd;
// Reallocate `temp_dir` and store path to preview file
char *preview_path = NULL;
allocSize = snprintf(NULL, 0, "%s/preview", cache_path);
preview_path = malloc(allocSize+1);
if(preview_path == NULL)
{
endwin();
printf("%s\n", "Couldn't allocate memory!");
exit(1);
}
snprintf(preview_path, allocSize+1, "%s/preview", cache_path);
// Create a child process to run "atool -lq filepath > ~/.cache/cfiles/preview"
pid = fork();
if( pid == 0 )
{
remove(preview_path);
fd = open(preview_path, O_CREAT | O_WRONLY, 0755);
null_fd = open("/dev/null", O_WRONLY);
// Redirect stdout
dup2(fd, 1);
// Redirect errors to /dev/null
dup2(null_fd, 2);
execlp("atool", "atool", "-lq", filepath, (char *)0);
exit(1);
}
else
{
int status;
waitpid(pid, &status, 0);
getTextPreview(preview_path, maxy, maxx);
free(preview_path);
}
}
在这种情况下,如果用户决定转到其他文件,我想继续执行程序的其余部分。我可以通过什么方式更改程序的架构?
【问题讨论】:
-
也许考虑为
SIGCHLD使用sigaction处理程序?这样,您可以等待子退出(由信号处理程序指示)或输入。 -
怎么能同时等待他们两个呢?如果我理解正确,它将等待孩子或等待输入
-
@Hasturkun,如果我理解正确你的意思,处理
SIGCHLD并使用sigaction说SIGUSR1,使用raise在用户输入上发出SIGUSR1的信号。 -
@JohnLeaf:如果您使用的是
select(或poll),您可以使用socketpair、eventfd或signalfd(前两个由信号处理程序)等待输入和子终止。存在其他类似的选项。 (有些取决于您的程序是否是多线程的) -
做两个分叉?