当父进程等待子进程终止时,子进程如何杀死父进程?

滑轮

我不明白以下代码:

pid_t pid;
int counter = 0;
void handler1(int sig) {
  counter++;
  printf("counter = %d\n", counter);
  fflush(stdout);
  kill(pid, SIGUSR1);
}
void handler2(int sig) {
  counter += 3;
  printf("counter = %d\n", counter);
  exit(0);
}
int main() {
  signal(SIGUSR1, handler1);
  if ((pid = fork()) == 0) {
    signal(SIGUSR1, handler2);
    kill(getppid(), SIGUSR1);
    while (1) {
    };
  } else {
    pid_t p;
    int status;
    if ((p = wait(&status)) > 0) {
      counter += 2;
      printf("counter = %d\n", counter);
    }
  }
}

在父进程等待其子进程终止之前,子进程如何实际杀死父进程?

约翰·布林格

首先请注意,kill()系统调用的名称有些错误,因为它是用于将信号发送到进程的通用函数。终止目标进程只是几种可能结果中的一种。

但是,更一般而言,信号处理是一种中断机制。大量的库函数,包括wait()可以通过接收信号中断的函数控制将该信号传递给已注册的处理程序(如果有),否则将执行默认操作。之后,被中断的函数将返回,并通过其返回代码和/或通过设置来指示错误errno

编辑添加:此外,您自己的代码可能会由于收到信号而中断。如果效果不是终止进程,则如果信号处理程序正常退出,则在中断处继续执行;如果通过调用退出处理程序,则在其他处恢复执行longjmp()

同样,信号传递是内核处理的异步机制。进程可能被阻塞或以其他方式占用并仍接收信号;确实,这是他们重点的重要组成部分。每个进程都有一个等待处理的待处理信号队列;对于大多数进程,此队列几乎一直都是空的,但是除非您显式阻止信号,否则一个进程假定它不会接收任何信号(并且始终无法阻止某些信号)永远是不安全的。

在您的特定代码中,主进程从设置function1()为signal的处理程序开始USR1然后进行分叉,子进程集将函数function2()用作信号处理程序USR1(不影响父进程),将信号发送USR1给父进程,并进入无限循环。

同时,父wait()进程为其子进程启动一个这将通过接收信号而中断。在收到信号并运行注册的处理程序之后,等待将结束,wait()返回-1并设置errnoEINTR处理程序执行的动作之一是将a发送SIGUSR1给孩子。

收到信号后,孩子的正常执行流程将中断以运行其处理程序function2()这将更新子级的变量副本counter,打印其值,然后输出exit()s。

最终结果:

主要过程打印

计数器= 1

然后退出。子进程打印

计数器= 3

然后退出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

父进程终止后如何杀死所有子进程?

来自分类Dev

父进程如何等待所有子进程终止

来自分类Linux

如果使用SIGSTOP终止子进程,则杀死父进程时子进程将死亡

来自分类Dev

当父进程被“ kill -9”杀死时,如何终止子进程

来自分类Dev

当父进程被杀死时杀死子进程

来自分类Dev

让父 Rust 进程终止而不等待子进程

来自分类Dev

防止linux子进程在父进程终止时终止

来自分类Dev

杀死子管道进程的父进程

来自分类Dev

当父进程结束时杀死子进程

来自分类Dev

僵尸进程(杀死子进程和父进程)

来自分类Linux

如何等待父进程退出子进程?

来自分类Java

当父进程退出时,如何使子进程退出?

来自分类Dev

当父进程退出时,如何让子进程存活?

来自分类Dev

子进程如何杀死其他子进程然后终止?

来自分类Dev

父进程如何知道它启动的子进程的进程ID?

来自分类Dev

如何知道某个进程是父进程还是子进程

来自分类Dev

仅杀死父进程,不杀死bash中的子进程和父进程

来自分类Dev

Bash子进程在执行eval exec时会杀死父进程

来自分类Linux

SIGTSTP处理程序会终止父进程和子进程

来自分类Dev

终止子进程的父进程的输出是什么?

来自分类Linux

当父进程被“ kill -9”杀死时,子进程也会被杀死吗?

来自分类Linux

子进程可以等待父进程在C语言中的Linux编程中终止吗?

来自分类Dev

如何杀死子进程

来自分类Dev

如何在不杀死子进程的情况下杀死父shell脚本进程?

来自分类Linux

子进程的进程父ID与父进程的PID不同

来自分类Dev

在父进程中,如何查看子进程管理的子变量?

来自分类Dev

子进程接收到的SIGINT只能由父进程处理,导致子进程突然终止

来自分类Linux

子进程在父进程之后开始

来自分类Dev

没有挂起父进程的子进程

Related 相关文章

  1. 1

    父进程终止后如何杀死所有子进程?

  2. 2

    父进程如何等待所有子进程终止

  3. 3

    如果使用SIGSTOP终止子进程,则杀死父进程时子进程将死亡

  4. 4

    当父进程被“ kill -9”杀死时,如何终止子进程

  5. 5

    当父进程被杀死时杀死子进程

  6. 6

    让父 Rust 进程终止而不等待子进程

  7. 7

    防止linux子进程在父进程终止时终止

  8. 8

    杀死子管道进程的父进程

  9. 9

    当父进程结束时杀死子进程

  10. 10

    僵尸进程(杀死子进程和父进程)

  11. 11

    如何等待父进程退出子进程?

  12. 12

    当父进程退出时,如何使子进程退出?

  13. 13

    当父进程退出时,如何让子进程存活?

  14. 14

    子进程如何杀死其他子进程然后终止?

  15. 15

    父进程如何知道它启动的子进程的进程ID?

  16. 16

    如何知道某个进程是父进程还是子进程

  17. 17

    仅杀死父进程,不杀死bash中的子进程和父进程

  18. 18

    Bash子进程在执行eval exec时会杀死父进程

  19. 19

    SIGTSTP处理程序会终止父进程和子进程

  20. 20

    终止子进程的父进程的输出是什么?

  21. 21

    当父进程被“ kill -9”杀死时,子进程也会被杀死吗?

  22. 22

    子进程可以等待父进程在C语言中的Linux编程中终止吗?

  23. 23

    如何杀死子进程

  24. 24

    如何在不杀死子进程的情况下杀死父shell脚本进程?

  25. 25

    子进程的进程父ID与父进程的PID不同

  26. 26

    在父进程中,如何查看子进程管理的子变量?

  27. 27

    子进程接收到的SIGINT只能由父进程处理,导致子进程突然终止

  28. 28

    子进程在父进程之后开始

  29. 29

    没有挂起父进程的子进程

热门标签

归档