【发布时间】:2016-07-22 06:06:25
【问题描述】:
我试图让一个主进程等待由 waitpid 指示的进程完成,但在调用 waitpid 时,发生了无限循环。
似乎waitpid引用的进程永远不会结束。
这个进程总是一个 execlp 到 unix 命令,如 wc, rev, cat ...
如果我注释掉关于waitpid的代码,unix命令就完美结束了。
调用任务和等待的代理代码:
int pid;
int estado_proceso;
for(pid=0;pid<numFiltros;pid++)
{
fprintf(stderr,"A esperar a %d\n", pids[pid]);
if (waitpid(pids[pid],&estado_proceso,0) >= 0)
imprimir_estado(filtros[pid], estado_proceso);
else
{
fprintf(stderr,"Error al esperar proceso %d\n",pid);
exit(1);
}
}
fprintf(stderr,"A ejecutar comando \n");
execlp(filtro,filtro, NULL);
fprintf(stderr,"Error al ejecutar el mandato '%s'\n",filtro);
exit(1);
编辑: Fork 和 Pid 获取代码:
switch(pid = fork())
{
/* Error en el Fork */
case -1:
fprintf (stderr,"Error al crear proceso %d\n", pid);
exit(1);
/* Father Process*/
default:
pids[i-1] = pid;
在主要:
pids = (pid_t*) malloc (sizeof(pid_t)*numFiltros);
其中 "numFiltros" 是 unix 命令的数量,例如 wc、cat、rev...
有什么想法吗? 非常感谢!
【问题讨论】:
-
如何获取子进程PID?你能给我们看看叉子吗? 另外,用英文命名变量和函数有很大帮助(现在我必须考虑它们的含义,这让我放慢了速度)
-
我已经发布了你说的代码。是的,下次我会用英文命名变量和函数。对不起:/
-
只运行1个命令(子进程)是否有效?您可以在创建子进程 PID 时以及在
waitpid调用之前打印它以确保它正确吗? -
如果我运行 1 个命令,当 waitpid 等待 5564 进程时,我有一个无限循环。看着这个数字,我认为 PID 是有效的。如果 y 尝试使用 2 个或更多命令运行,结果是一样的,waitpid 会永远阻塞主进程。但是,如果我评论 waitpid 代码,一切正常。
-
主进程将他的输出连接到第一个孩子的标准输入。第一个孩子将他的输出连接到他孩子的标准输入并连续(使用管道)。