首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在父进程被终止时杀死子进程

在父进程被终止时杀死子进程是一种常见的操作,以确保子进程不会在父进程结束后继续运行。这可以通过在父进程中使用信号处理程序来实现。

在Linux系统中,可以使用signal()函数来设置信号处理程序。例如,可以使用以下代码来设置父进程在接收到SIGTERM信号时杀死子进程:

代码语言:c
复制
#include<signal.h>
#include <unistd.h>
#include <sys/wait.h>

void sig_handler(int sig) {
    pid_t pid;
    while ((pid = waitpid(-1, NULL, WNOHANG)) > 0) {
        kill(pid, SIGTERM);
    }
    exit(0);
}

int main() {
    signal(SIGTERM, sig_handler);
    pid_t pid = fork();
    if (pid == 0) {
        // 子进程代码
    } else {
        // 父进程代码
    }
    return 0;
}

在这个例子中,当父进程接收到SIGTERM信号时,信号处理程序sig_handler()会被调用。在信号处理程序中,我们使用waitpid()函数来获取所有子进程的ID,并使用kill()函数向它们发送SIGTERM信号,以便它们终止。

在Windows系统中,可以使用CreateProcess()函数来创建子进程,并使用TerminateProcess()函数来杀死子进程。例如,可以使用以下代码来创建子进程并在父进程被终止时杀死子进程:

代码语言:c
复制
#include<windows.h>
#include<process.h>

HANDLE hProcess;

void sig_handler(int sig) {
    TerminateProcess(hProcess, 0);
    exit(0);
}

int main() {
    signal(SIGTERM, sig_handler);
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(pi));
    CreateProcess("child.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    hProcess = pi.hProcess;
    // 父进程代码
    return 0;
}

在这个例子中,我们使用CreateProcess()函数创建子进程,并将子进程的句柄存储在全局变量hProcess中。当父进程接收到SIGTERM信号时,信号处理程序sig_handler()会被调用。在信号处理程序中,我们使用TerminateProcess()函数来杀死子进程。

总之,在父进程被终止时杀死子进程可以通过在父进程中使用信号处理程序来实现。在Linux系统中,可以使用signal()函数和kill()函数来设置信号处理程序和发送信号。在Windows系统中,可以使用CreateProcess()函数和TerminateProcess()函数来创建子进程和杀死子进程。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

进程退出如何确保进程退出?

前言 进程退出的时候,进程能够收到进程退出的信号,便于管理,但是有时候又需要在进程退出的时候,进程也退出,该怎么办呢? 进程退出进程会如何?...一般情况下,进程退出后,是不会通知进程的,这个时候进程会成为孤儿进程,最终init进程收养。我们先来看一下这种情况。...内容很多,主要意思为:设置一个信号,当进程退出的时候,进程将会收到该信号。 那么根据这个,我们完全可以进程退出,也给进程一个退出的信号。...可以看到,由于加入了 prctl(PR_SET_PDEATHSIG,SIGKILL); 进程退出进程将会收到SIGKILL信号,而进程收到该信号的默认动作则是退出。...总结 有些情况下,我们常常需要父子进程共存亡,进程退出进程可以通过wait捕捉进程的退出状态,但是进程退出进程却难以得知。

11.8K21

探索进程进程

先来认识一下fork函数: fork函数会以调用该函数的进程作为进程创建一个进程 创建成功,会在进程中返回进程的PID,进程中返回0;如果失败,进程中返回-1,没有进程创建。...执行进程,当id==0,执行进程。...一个进程可以创建多个子进程,为了区分这些进程,fork函数创建进程后,会给进程返回进程的pid。进程只需调用getppid()函数即可找到进程。...进程可以把进程的数据全拷贝一份,但是大部分数据对于进程来说可能都是没用的,这就造成了浪费,所以操作系统只是把进程中数据层面的代码临时拷贝一份给进程,即进程创建后,会共享进程的代码和数据,...变量id接收的值是fork函数返回的值,进程return一次,进程return一次,进程会执行写拷贝,所以变量会有两个返回值,本质上是有两块空间。

10510

内存不足:杀死进程还是牺牲进程

这些守护进程几个看起来糟透了的内核任务看管。所有现代Linux内核都内置了一个被称为“内存不足杀手”的机制,它在内存不足的情况下会杀掉用户进程。当检测到内存不足,杀手会被激活并选择一个进程杀死。...选择机制是用启发式算法对所有进程进行打分,最后选择得分最低的进程杀死。 理解“内存不足杀手” 默认情况下,Linux内核允许进程请求比当前系统可用内存更多的内存。...过量使用内存配置也允许为这些进程申请越来越多的内存,最后触发了“内存不足杀手”,就像它的名字那样,杀死我们的应用然后半夜把我叫醒。...你会发现类似下面的消息:Kill process (java) score 或牺牲进程的消息。 注意:你可能需要修改交换区和堆大小。...并且我还建议允许交换,但是当咨询过工程人员后,我意识到Java虚拟机中的垃圾回收进程交换表现不是很好,所以这个选项最后没有采用。

2.1K10

Windows内核之进程终止进程

通过调用ExitProcess函数,C++/C执行期启动代码可以确保主线程从它的进入点函数返回进程便终止执行,而无论进程中是否还有其它线程执行。...ExitProcess以及ExitThread能保证操作系统资源函数调用时清除,可是不能保证C/C++执行时资源正确的清除,所以不妨不要调用这些资源。...进程终止状态由STILL_ACTIVE变为了进程的返回代码 这个函数是异步的,它告诉操作系统,你要终止某个进程,可是当函数返回的时候,你无法保证进程是否已经被杀死,假设想要确切知道进程是否被杀死...2 进程终止的情况 进程中全部剩余线程将被终止 进程中指定的用户对象,GDI对象释放,内核对象关闭 内核对象的状态编程收到通知的状态 进程的退出代码由STILL_ACTIVE...3 进程 程序中要实现一段功能一共同拥有3种方法: 调用函数 开辟新线程 开辟新进程 3.1 调用函数 调用函数很常见的,可是它的缺点是由于同一个线程中

1.7K20

Linux:进程概念(二.查看进程进程进程进程状态详解)

2.进程进程 2.1介绍 操作系统中,当一个进程(称为进程)创建另一个新进程(称为进程,父子进程之间建立了一种特殊的关系。...资源继承: 进程继承了进程的大部分属性和资源,包括内存映像、文件描述符、信号处理器等。 进程创建拥有进程的副本,但在其生命周期中可以独立修改这些副本。...fork 调用成功进程中返回进程的 PID,而在进程中返回 0。 如果 fork 调用失败,则返回一个负数,表示错误。... fork 调用后,操作系统并不会立即复制进程的内存给进程,而是让父子进程共享同一段内存空间。只有当其中一个进程试图修改共享的内存,操作系统才会复制该内存页,确保修改不会影响到其他进程。...因此,fork 执行时会返回两次:一次进程中(返回进程的 PID),另一次进程中(返回 0)。这样做是为了让进程进程可以根据返回值来执行不同的代码路径。

73910

关于进程进程的关系(UAC 绕过思路)

windows中。 假设是a进程创建了b进程,那么a进程就是b进程进程。...这对于一部分低端的木马具有提醒作用(注意这里说的是能够提示一般的 灰鸽子等变种,高端的木马会绕过这里,具体思路见后面),好了这里再回头说进程关系,这里先说一句关键的话:进程创建进程。...他的进程能够指定。这个是《深入解析Windows操作系统》(第六版)中有具体的说明,里面的意思是这样解释UAC提权的,当用户同意一次UAC提权时。...假设你调试的程序检測进程,直接用以上的办法启动它,当然进程就是他检測同意的进程喽, 这里启动要注意的是设置CREATE_SUSPEND 就是创建挂起,然后创建后使用ResumeThread恢复就能够顺利调试了...所以说进程进程不一定是进程的创建者,所以那一群依据进程来看进程是否可信的杀软就呵呵了。 可是这里说下 360 这个绕只是,原因是啥哪? 记得我开篇说过道高一尺,魔高一丈吗?

1.6K30

PostgreSQL - 如何杀死锁死的进程

前言 一次系统迭代后用户投诉说无法成功登陆系统,经过测试重现和日志定位,最后发现是由于用户ui上进行了某些操作后,触发了堆栈溢出异常,导致数据库里的用户登陆信息表的数据锁住,无法释放。...虽然后来解决了问题,但是数据库里这个用户登录信息表里lock住的数据始终无法释放,这导致用户永远无法登陆成功,需要手动跑SQL把锁去掉才行。...杀掉指定进程 PostgreSQL提供了两个函数:pg_cancel_backend()和pg_terminate_backend(),这两个函数的输入参数是进程PID,假定现在要杀死进程PID为20407...() 需要superuser权限,可以关闭所有的后台进程 向后台发送SIGTERM信号,用于关闭事务,此时session也会被关闭,并且事务回滚 那么如何知道有哪些表、哪些进程锁住了?...这里有几个重要的column:a.pid是进程id,b.relname是表名、约束名或者索引名,a.mode是锁类型。

1.9K20

Golang杀死进程的三种方式

前言熟悉Golang语言的小伙伴一定都知道,杀死进程有三种方式,今天就来简单介绍一下。...正文Golang中有三种方式可以杀死进程,分别是cmd.Process.Kill(), syscall.Kill, 和 cmd.Process.Signal。...它们都是通过向进程发送信号的方法来关闭进程。一、cmd.Process.Kill()cmd.Process.Kill() 是 os/exec 包中的一个方法,用于终止一个进程及其所有进程。...这个方法只能用于已经启动的进程,需要通过 exec.Command 创建一个 *exec.Cmd 对象,并调用 Start() 方法来启动进程,然后可以使用 cmd.Process.Kill() 来终止进程...结论总结来说,cmd.Process.Kill() 是 os/exec 包提供的方法,用于强制终止一个进程及其所有进程;syscall.Kill 是一个系统调用函数,用于向进程发送信号,需要提供正确的进程

1.2K00

C语言Linux系统编程-等待终止进程(僵死进程

1.等待终止进程(僵死进程): 如果一个进程进程之前结束,内核会把子进程设置为一个特殊的状态,处于这种状态的进程称为僵死进程进程获取了进程的信息后,进程才会消失。...pid_t wait(int *status); 进程调用这个方法会被阻塞住,如果子进程终止的时候,此方法会调用并且返回终止进程的pid #include #include <unistd.h...=wait(&status); printf("我的进程,pid=%d,终止了\n",sonPid); }else if(ret==0){...,pid=22315 , ppid=12479 ,我新建的进程pid=22316 我是进程,pid=22316 , ppid=22315 我的进程,pid=22316,终止了 2.如果进程进程之前终止了...,那么系统会把子进程设置给init进程(pid为1),init进程会周期性的等待所有的进程,确保没有长时间的僵死进程

3.5K20

【Linux 内核】进程管理 ( 进程状态 | 进程创建 | 进程终止 | 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 )

文章目录 一、进程状态 二、进程创建 三、进程终止 ( 调用 exit 系统调用函数主动退出 | main 函数返回自动退出 | kill 杀死进程 | 执行异常退出 ) 一、进程状态 ---- Linux...进程有如下状态 : 创建状态 : 进程 刚被创建 , 处于创建状态 ; 就绪状态 : 进程 已经 获取了 相关资源 , 以及 运行条件准备就绪 ; 执行状态 : CPU 时间片分配给了该进程 ,...正在 CPU 中执行该进程 ; 阻塞状态 : 等待分配 CPU 时间片的过程 中 , 处于该状态 ; 终止状态 : 进程 终止后的状态 ; 状态之间的转换 , 参考 【Linux 内核】进程管理 (...| 执行异常退出 ) ---- 进程终止的方式 : 主动退出 : 主动调用 exit() 系统调用函数 主动退出 ; 自动退出 : 程序的 main 函数返回 , 自动退出 ; 从 main() 函数返回...自己不能处理的信号 , 被迫终止 ; 前两种是 进程主动退出 , 后两种是 进程被动退出 ; exit() 系统调用 函数 , 定义 linux-5.6.18\kernel\exit.c 源码中 ,

2.8K20

Fkill –Linux上搜索并终止进程

Fkill是Fabulous Kill的缩写,它是一个跨平台的命令行实用程序,可一次交互式地搜索和杀死多个进程。...$ npm install --global fkill-cli Linux上使用Fkill交互式搜索并杀死多个进程 要搜索并终止进程,只需运行: $ fkill 此命令将启动交互式UI,您可以在其中找到正在运行的进程列表及其端口号...使用向上/向下箭头选择一个进程,然后按ENTER键将其杀死。您还可以键入进程名称的前几个字母,然后从列表中选择该进程,然后按Enter以将其杀死。 ? 要退出交互式UI,请按CTRL + c。...如果您已经知道端口号,例如2236,则可以使用以下命令直接将其杀死: $ fkill 2236 您可以通过使用空格分隔端口号来一次杀死多个进程。...要终止一个端口(例如3306),只需它前面加上一个类似下面的冒号。

2.3K10

宋宝华: Linux僵尸进程可以杀死”吗?

什么是僵尸 首先要明确一点,僵尸进程的含义是:进程已经死了,但是进程还没有wait它的一个中间状态,这个时候进程是一个僵尸。...正常情况下子死,wait,清理掉进程的task_struct,释放进程的PID: ? 编译上述程序,运行,我们看到2个a.out进程: ? 杀死进程4578,看到进程的打印: ?...之后,4578会消失,因为进程执行到了wait,也知道了进程信号2杀掉的。...但是如果子进程死了,进程不执行到wait,比如把上图中的"#if 0"改为"#if 1",杀死进程后,进程就是一个僵尸: ?...所以,本例中,kill -9 4730看起来是"杀死了僵尸”,实际是杀死了4731,导致整个进程死。

2.5K10

如何在进程中读取(外部)进程的标准输出和标准错误输出结果

依稀记得去年年中,有个同事也问过我如何获取调用进程的输出结果,当时还研究了一番,只是没有做整理。今天花点时间,将该方法整理成文。...它是我们启动进程,控制进程启动方式的参数。...我们之后将hWrite交给我们创建的进程,让它去将信息写入管道。而我们进程,则使用hRead去读取进程写入管道的内容。...这就解释了我们之前为什么创建管道要将句柄可继承性设置为TRUE的原因。         一般来说,我们要代理的程序已经输入好信息了。我们要关闭写管道 if ( NULL !...delete [] pBuffer; wprintf(L"%s", cstrBuffer); } return 0; }         这样,我们就可以拿到进程输出结果并加以分析

3.8K10

宋宝华: 僵尸进程的成因以及僵尸可以杀死”吗?

什么是僵尸 首先要明确一点,僵尸进程的含义是:进程已经死了,但是进程还没有wait它的一个中间状态,这个时候进程是一个僵尸。...正常情况下子死,wait,清理掉进程的task_struct,释放进程的PID: ? 编译上述程序,运行,我们看到2个a.out进程: ? 杀死进程4578,看到进程的打印: ?...之后,4578会消失,因为进程执行到了wait,也知道了进程信号2杀掉的。...但是如果子进程死了,进程不执行到wait,比如把上图中的"#if 0"改为"#if 1",杀死进程后,进程就会是一个僵尸: ?...所以,本例中,kill -9 4730看起来是"杀死了僵尸”,实际是杀死了4730整个进程(里面的每个线程),导致整个进程死。在次之前,整个进程实际还是活的。

1.6K20
领券