【问题标题】:How to avoid killing child process early?如何避免过早杀死子进程?
【发布时间】:2015-12-14 20:33:44
【问题描述】:
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>

#define MAX_PIDS 28

volatile pid_t *pids;

void kPid(int x)
{
    int c;
    for (c=0; c<10; c++) {

    if (pids[c] == x)
    {   
        int status = 0;
        pids[c] = wait(&status);
    }
    else {
        continue;
    }
  }
}



int main(int argc, char **argv)
{
  int c;
  pid_t pid;
  pids = mmap(0, MAX_PIDS*sizeof(pid_t), PROT_READ|PROT_WRITE,
              MAP_SHARED | MAP_ANONYMOUS, -1, 0);

  memset((void *)pids, 0, MAX_PIDS*sizeof(pid_t));
  for (c=0; c<10; c++) {
    pid = fork();
    if (pid == 0) {
      exit(1);
    } else if (pid < 0) {
      perror("fork failed");
    } else {
      pids[c] = pid;
    }
  }

  int t;
  char test[50];
  snprintf(test,sizeof(test),"ps -ef | grep defunct",pids[c]);
  system(test);
  printf("Kill child: ");
  scanf("%d",&t);
  kPid(t);
  system(test);
  exit(0);
}

现在当我使用命令时: snprintf(test,sizeof(test),"ps -ef | grep defunct",pids[c]);

它表明进程已经失效,如何避免这种情况?我知道“退出(1);”杀死这个过程,但我可以用什么代替这个? 我希望以后能够终止该进程

【问题讨论】:

  • 你问的是如何让孩子们不死,或者如何让他们死后不死?
  • “我希望以后能够终止进程”当然似乎表明他希望孩子们不要死,但他在(第一个,到目前为止)答案上的 cmets 对此表示怀疑。

标签: c process child-process


【解决方案1】:

避免失效进程的最简单方法是忽略 SIGCHLD:

signal(SIGCHLD, SIG_IGN);

否则,使用 waitpid() 等待子进程终止。这主要取决于您是否想知道孩子何时终止以及它的退出代码是什么。如果您不需要该信息,请使用信号方法

【讨论】:

  • 该行放在哪里? (信号(SIGCHLD,SIG_IGN);)以及当我删除此行时如何防止无限循环=>退出(1)
  • 您可以在主函数启动后立即执行此操作。不要不要删除出口(1)。
  • 这似乎没有抓住重点。他说,我认为,他希望子进程不死(还),而不是在它们死时忽略它们。
  • 在那之后我看不到任何进程:) 我想创建子进程,列出它们,然后选择一个 PID 死...然后再次列出下一个。
  • 进程要么启动并运行(可以被杀死)要么失效。两者同时是不可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多