当前位置: 首页 > 面试题库 >

跟踪子进程的死亡

何升
2023-03-14
问题内容

在不让父进程等待子进程被杀死的情况下,我如何跟踪子进程的死亡?

我正在尝试一个客户端-服务器方案,其中服务器从客户端接受连接,并为它接受的每个连接派生一个新进程。

我忽略了SIGCHLD信号以防止僵尸创建。

signal(SIGCHLD, SIG_IGN);
while(1)
{
  accept();
  clients++;
  if(fork() ==0)
  {
     childfunction();
     clients--;
  }
  else
  {
  }
}

上述情况下的问题是,如果子进程在childfunction()函数中被杀死,则全局变量clients不会递减。

注意: 我正在寻找不使用SIGCHLD信号的解决方案…如果可能


问题答案:

通常,您编写一个SIGCHLD调用waitpid()pid 的处理程序-1。您可以使用返回值确定pid死了多少。例如:

void my_sigchld_handler(int sig)
{
    pid_t p;
    int status;

    while ((p=waitpid(-1, &status, WNOHANG)) != -1)
    {
       /* Handle the death of pid p */
    }
}

/* It's better to use sigaction() over signal().  You won't run into the
 * issue where BSD signal() acts one way and Linux or SysV acts another. */

struct sigaction sa;

memset(&sa, 0, sizeof(sa));
sa.sa_handler = my_sigchld_handler;

sigaction(SIGCHLD, &sa, NULL);

或者,您可以waitpid(pid, &status, 0)使用指定的子进程ID进行调用,并同步等待其终止。或用于WNOHANG检查其状态而不会阻塞。



 类似资料:
  • 问题内容: 我曾经短暂地附加一个过程。该过程创建了90个线程。当我找到有问题的线程时,我必须繁琐地搜索父线程,然后是祖父母线程,一直到根进程。 是否有技巧或工具可以快速找出哪个线程创建了另一个线程?还是更好,打印类似树的线程创建树? 问题答案: 跟踪编辑的子进程。

  • 此命令可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。可以使用 pstack 来确定进程挂起的位置。此命令允许使用的唯一选项是要检查的进程的 PID。请参见 proc(1) 手册页。 这个命令在排查进程问题时非常有用,比如我们发现一个服务一直处于work状态(如假死状态,好似死循环),使用这个命令就能轻松定位问题所在;可以在一段时间内,多执行几次pstack,若发

  • 我们的SQL服务器上出现了死锁。我在堆栈溢出和其他地方读了很多页,但是我找不到如何读取跟踪日志的一步一步的指令列表。有人能告诉我如何解释这个吗?显然现在我需要知道如何解释这个特定的日志,但是我真正需要的是长期学习如何读取未来的日志。 完整的跟踪日志如下。让我解释一下我们是如何解释的。然后你可以告诉我我们做错了什么,以及如何正确阅读。 我们在想这些话: 06/14/2018 14:56:25, sp

  • 问题内容: 我有一个程序生成并与CPU繁重,不稳定的进程通信,而不是由我创建的。如果我的应用程序崩溃或被杀死,我也希望子进程也被杀死,因此用户不必跟踪它们并手动杀死它们。 我知道以前已经讨论过该主题,但是我已经尝试了所有描述的方法,但似乎没有一种方法能够经受住测试的考验。 我知道这是有可能的,因为终端一直在这样做。如果我在终端中运行某些程序并杀死该终端,则这些东西总是会死掉。 我试过了,双叉和。不

  • 跟踪行为控制着 Entity Framework Core 是否会在其变更跟踪器里维持实体实例的信息。如果实体是被跟踪的,任何检测到的该实体的变更都将在 SaveChanges() 时持久化到数据库中。Entity Framework Core 还会对已跟踪的、之前已加载到 DbContext 实例中的查询和实体进行相互的导航属性装配。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。

  • 问题内容: 我正在使用child_process.spawn()从在Ubuntu上运行的Node.JS应用程序启动脚本。据我所知,标准的分叉或生成的* nix进程通常不会在父进程死后死亡,但是当从Node.JS生成进程时,它们似乎在我的应用程序崩溃或被ctrl-c等终止时被杀死。 。 为什么会这样,并且有解决办法?我似乎在child_process API中找不到任何明显的选项。 我的应用程序启动