【问题标题】:Infinite Loop waiting a process on C无限循环等待 C 上的进程
【发布时间】: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 代码,一切正常。
  • 主进程将他的输出连接到第一个孩子的标准输入。第一个孩子将他的输出连接到他孩子的标准输入并连续(使用管道)。

标签: c unix posix


【解决方案1】:

尝试使用wait 而不是显式的waitpid,也就是说,尝试将您的等待代码替换为

int pid;
int estado_proceso;

while((pid = wait(&estado_proceso)) >= 0) {
    if(pid > 0) {
        fprintf(stderr, "Process with PID %d terminated.\n", pid);
        imprimir_estado(pid, estado_proceso);
    }
}

【讨论】:

  • 是的,它有效。老实说,我不知道为什么。非常感谢!
  • 很高兴听到这个消息。尝试打印存储在数组中的 PID 值和 wait 调用返回的 PID 值。如果他们的顺序不同,那么你就知道为什么它以前不起作用了。
猜你喜欢
  • 2020-03-27
  • 2017-12-12
  • 1970-01-01
  • 2023-01-20
  • 2010-11-03
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
相关资源
最近更新 更多