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

如何在它自己的SIGCHLD处理程序中获取设置进程的PID?

在自己的SIGCHLD处理程序中获取设置进程的PID,可以通过以下步骤实现:

  1. 在程序中注册SIGCHLD信号的处理函数,可以使用signal函数或者sigaction函数来注册。例如,使用signal函数可以这样注册SIGCHLD信号的处理函数:
代码语言:txt
复制
signal(SIGCHLD, sigchld_handler);
  1. 在SIGCHLD信号的处理函数中,使用waitpid函数来获取子进程的PID。waitpid函数会阻塞当前进程,直到有子进程退出。可以通过传入WNOHANG选项来实现非阻塞的等待。例如,可以这样获取子进程的PID:
代码语言:txt
复制
void sigchld_handler(int signum) {
    int status;
    pid_t pid;
    
    // 循环等待所有子进程退出
    while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
        // 处理子进程退出的逻辑
        // 可以在这里获取子进程的PID并进行相应的操作
    }
}

在上述代码中,waitpid函数的第一个参数为-1,表示等待任意子进程退出。第二个参数为一个指向整型变量的指针,用于存储子进程的退出状态。WNOHANG选项表示非阻塞等待,即如果没有子进程退出,waitpid函数会立即返回0。

通过以上步骤,就可以在自己的SIGCHLD处理程序中获取设置进程的PID。根据具体的需求,可以在处理函数中进行相应的操作,例如记录日志、释放资源等。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙:https://cloud.tencent.com/solution/virtual-universe
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

内核根据进程Pid获取全目录

一丶简介 在内核中有时候想通过PID 获取进程全路径以达到监控作用 比如我们设置进程回调.则可以根据PID看下进程全路径....二丶原理 原理就是在内核 通过 ZwQueryInformationProcess 这个未公开函数 进行查询. 查询好是 ** ProcessImageFileName ** 也就是27号功能....但是查询出来路径是Dos路径.还需要进行转化. 1.传入PID 使用 ZwOpenProcess打开PID获取Handle 2.使用ZwQueryInfomationProcess*27号功能(ProcessImageFileName...) 传入 ProcessHandle来获取路径. 3.代码实现. 1.首先是未公开函数获取....NT路径 NTSTATUS GetDosPathByProcessId(ULONG pid) { /* 1.根据PID获取进程句柄 2.使用ZwQueryInformationProcess

1.7K10

【Android 逆向】修改运行 Android 进程内存数据 ( Android 命令行获取要调试应用进程 PID | 进程注入调试进程内存 so 库 )

文章目录 一、Android 命令行获取要调试应用进程 PID 二、进程注入调试进程内存 so 库 一、Android 命令行获取要调试应用进程 PID ---- 前置博客 【Android...逆向】修改运行 Android 进程内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system ) 先安装 Android...模拟器 , 雷电模拟器 3.75 版本 ; 在模拟器安装要调试应用后 , 直接运行 ; 执行 dumpsys activity top|grep pid 命令 , 查看当前正在运行应用进程号...PID 为 2328 ; 二、进程注入调试进程内存 so 库 ---- 在 【Android 逆向】修改运行 Android 进程内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝...: chmod 777 tool chmod 777 libbridge.so /data/system/debug/tool 工具有了执行权限后 , 开始向 PID 为 2328 进程注入调试动态库

67610

等待子进程那些事儿

,在 SIGCHLD 信号处理调用 wait 等待已结束进程,回收进程信息,防止产生僵尸进程 (zombie)。...这是通过指定 SA_SIGINFO 标志位,并提供带 siginfo_t 参数信号处理器来实现 (info->si_pid 就是结束进程进程号); 使用 sigaction 可以获取除子进程结束以外状态变更通知...我们可以为 SIGCHLD 提供一个处理器,虽然在此信号处理无需再次等待子进程,但是我们拥有了获取进程信息能力,相对而言,比 SIG_IGN 更有用一些。...在处理也应使用 waitpid 等待子进程返回 ECHILD 错误,证明该子进程是前台进程,已经被同步 wait 掉了,不需要任何处理;否则作为后台进程处理。...可见,当程序存在 pclose、system 等隐式 wait 调用时,如果同时需要 SIGCHLD 信号处理,则一定不能: 注册为忽略 SIG_IGN; 通过 sigaction 注册并设置 SA_NOCLDWAIT

2.4K30

AirPlay Deamon学习(Linux Daemon)

它独立于控制终端并且周期性地执行某种任务或等待处理某些发生事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。...守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr输出都需要特殊处理。...一个进程只能为它自己或子进程设置进程组ID号 会话期: 会话期(session)是一个或多个进程集合。...; (3)在子进程调用chdir函数,让根目录 ”/” 成为子进程工作目录; (4)在子进程调用umask函数,设置进程umask为0; (5)在子进程关闭任何不需要文件描述符 说明:...为防止这一点,将文件创建掩模清除:umask(0); 处理SIGCHLD信号 处理SIGCHLD信号并不是必须。但对于某些进程,特别是服务器进程往往在请求到来时生成子进程处理请求。

1.2K30

吃土记之GDB调试原理

执行信号处理函数。 你知道 redis 通过 fork 管道 信号SIGCHLD方式完成持久化。 你知道valgrind通过非侵式方式,在机器码层接管程序,通过跟踪汇编汇总寄存器 栈 来进程内存泄漏。...read_lock(&tasklist_lock); child = find_task_by_pid(pid); // 获取 pid 对应进程 task_struct 对象 if (...调试进程GDB)调用 ptrace(PTRACE_ATTACH, pid, ...) 来使指定进程进入被追踪模式。...单步调试模式(PTRACE_SINGLESTEP) 单步调试是一个比较有趣功能,当把被调试进程设置为单步调试模式后,被调试进程没执行一条CPU指令都会停止执行,并且向父进程(调试进程)发送一个 SIGCHLD...我们再来看看,进程是怎么处理 SIGTRAP 信号

99820

Linux: 关于 SIGCHLD 更多细节

僵尸进程 何为僵尸进程? 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取进程状态信息,那么子进程进程描述符仍然保存在系统。...对该机制有稍微了解的话,不难得知一个关键因素:SIGCHLD。正是这个SIGCHLD起到了通知作用,所以后面的处理也是基于它而实现。...不用担心 init会挂着一堆僵尸, init本身设计就有专门回收处理,所以有多少回收多少; SIGCHLD 还能干嘛 刚才我们在处理到父子进程相关问题时,多多少少接触到SIGCHLD, 那么,只有在回收子进程时候才需要用到么...其实wait是对waitpid封装,专门用来回收子进程退出信息,同样,它简单粗暴设置成了堵塞方式,如果没有任何子进程退出,那么就堵塞住。...而waitpid功能非常强大,pid和options都提供了非常灵活用法: pid: < -1: 取该 pid 绝对值,如果任何子进程进程组ID等于该值,则该进程任一子进程进程状态发生变化

2.7K60

php 信号处理操作实例详解

本文实例讲述了php 信号处理操作。分享给大家供大家参考,具体如下: 首先我们需要了解几个函数 pcntl_signal 安装信号处理器,也就是当指定信号发生时,调用函数。...SIGKILL 用来立即结束程序运行。本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。...\r\n"; exit; } 当子进程退出时,会向父进程发送SIGCHLD信号,我们通过设置信号处理器,成功处理信号。 例2: <?...pcntl_signal(SIGCHLD, 'sig_func'); //设置信号处理器,也注释掉 //不然当父进程发向子进程发送SIGTERM信号时,子进程不会退出,还会继续执行 //我们信号处理函数把...如果我们设置了SIGTERM信号处理器,并且在自定义信号处理并没有杀死该进程,则该子进程会一直运行下去。

61621

又一种后门病毒针对Linux系统,火绒可拦截

历史清除 2:校验输入参数,并进行相应处理。如果没有输入参数,就进行后续处理。 校验参数 3:从自身获取配置 提取配置 4:忽略所有信号并重新注册 SIGCHLD 信号。...”设置 fork 进程: 样本后续通过 fork 分支了多个子进程,子进程之间互相关联且涉及到配置 mgr_pid 和 monitor_pid 进程,梳理如下: 流程图 子进程1:监控全局 最先分支出来进程...开启进程 3 负责监控操作,其获取配置 mon_interval (10 秒)值作为监控周期,循环执行: 循环检测 对于配置设置 "cmd%d" 命令,则会在该进程遍历执行: 命令执行...protocol 来选择要使用通信协议进行管理: 协议选择 关于 SIGCHLD 信号: 在前期对信号处理操作中注册 SIGCHLD 信号处理函数是对“工作者”进程 2、3 进行处理。...因为当第一个子进程终结后,SIGCHLD 处理函数还要等待第二个子进程终结才能进入条件。在该条件句中,执行操作是重置 mgr_pid 和 monitor_pid 值。

21110

详解linux下避免僵尸进程几种方法

linux下我们可以调用fork函数创建子进程,创建进程将会得到父进程数据空间、堆、栈……副本(采用写时复制机制),子进程将会继承父进程信号掩码、信号处理方式、当前工作目录、会话id、组id……...当子进程退出时父进程应当及时获取进程退出状态,否则,如果父进程是一直在运行,那么子进程退出状态将一直保存在内存,直到父进程退出才释放。...2.调用fork两次(第一次调用产生一个子进程,第二次调用fork是在第一个子进程调用,同时将父进程退出(第一个子进程退出),此时第二个子进程进程id为init进程id(注意:新版本Ubuntu...3.在程序显示忽略SIGCHLD信号(子进程退出时会产生一个SIGCHLD信号,我们显示忽略此信号即可)。 4.捕获SIGCHLD信号并在捕获程序调用wait/waitpid函数。...\n"); /**在第一个子进程再次fork***/ if ((pid = fork()) < 0) { perror("fork error"); return

1.7K42

sigaction信号处理

sa_mask 指定信号集搁置 sa_flags:设置信号处理相关操作 SA_SIGINFO:如果设置,那么采用sa_sigaction;默认采用sa_handler SA_RESETHAND:当调用信号处理函数时...,将信号处理函数重置为缺省值SIG_DFL SA_RESTART:如果信号中断了进程某个系统调用,则系统自动启动该系统调用 SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号...si_pid; /* 发送信号进程ID,对kill(2),实时信号以及SIGCHLD有意义 */ uid_t si_uid; /* 发送信号进程真实用户ID,对kill...pid, int sig, const union sigval val)第三个参数传递过来数据 :siginfo_t.si_value.sival_int或siginfo_t.si_value.sival_ptr..., SIGCHLD, var); SIGCHLD信号被设置,sigaction主动发送一次信号;子进程退出,系统还会调用sig_handler信号处理,此时携带参数为0 参考:http://blog.csdn.net

48610

Android 进程保活 两种实现方式

android:persistent="true" 网上还提出了设置这个属性办法,通过实验发现即使设置了这个属性,应用程序被kill之后还是不能重新启动起来!...可见进程 Visible process 服务进程 Service process 后台进程 Background process 前台进程 Foreground process 如何在程序杀死清下重启进程...sa_flagsSA_NOCLDSTOP选项打开, 当子进程停止(STOP作业控制)时, 不产生此信号(即SIGCHLD)。...僵尸 sigaction函数: 函数功能是:检查或修改与指定信号相关联处理动作 sigaction(SIGCHLD, &sa, NULL); wait()函数 函数功能是:父进程一旦调用了wait...如何在程序杀死清下重启进程-----socket方式 进程间通信 思路 创建一个子进程作为socket服务端 将主进程作为客户端,通过socket进行连接,当主进程被杀死之后,子进程服务端会受到一个主进程被杀消息

5.8K20

何在Ubuntu 16.04上将Redis服务器设置为PHP会话处理程序

在本教程,我们将了解如何安装和配置外部Redis服务器,以用作在Ubuntu 16.04上运行PHP应用程序会话处理程序。 会话处理程序负责存储和检索保存到会话数据。...这对于单个服务器来说效果很好,但由于会话信息与单个服务器相关联,因此具有一些重要性能和可伸缩性限制。 外部会话处理程序为多个应用程序服务器可以使用共享会话数据提供中心位置。...该网站服务器尚未配置为使用此服务器Redis作为会话处理程序。...第五步:将Redis设置为Web服务器上默认会话处理程序 现在我们需要在Web服务器上编辑php.ini文件以更改PHP默认会话处理程序。此文件位置取决于您当前堆栈。...第六步:测试Redis会话处理 为了确保您会话现在由Redis处理,您将需要一个PHP脚本或应用程序来存储会话信息。我们将使用一个实现计数器简单脚本。

1.4K41

Linux系统编程 - 进程异常自动重启

则可以通过这点,实现进程异常crash重启。 「方案一」   在《Linux系统编程》,有讲道:当子进程终止时,会发送SIGCHLD至父进程。...因此可按如下流程: 父进程先创建一个子进程,在子进程通过execl拉起需要bin。此时父进程缓存bin文件对应路径和对应pid。...父进程注册信号SIGCHLD监听,在处理函数,通过wait()/waitpid()获取异常子进程pid。 通过pid匹配异常进程对应bin文件路径,再重新拉起此进程。...获取到子进程pid后,父进程一直检测/proc/[pid]是否存在,不存在时,重新拉起进程。...至于方案一偶尔收不到SIGCHLD,缩短处理函数响应时间,排除信号处理函数不可重入因素,还是存在问题。网上查到原因此信号不可靠,具体原因尚不清晰。

35921

【Linux】volatile | SIGCHLD | 多线程概念

quit变量进行寄存器级别的优化,保证内存可见性 ---- 再次运行可执行程序,输入2号信号,跳出while循环,执行mainprintf打印 2.SIGCHLD信号 子进程在运行时会退出,若父进程不关心子进程退出...,子进程就会变成僵尸状态 父进程要使用 wait/waitpid去等待子进程 回收僵尸,获取进程退出结果 即父进程进行阻塞式等待(什么都不干,就等待子进程退出结果) 父进程主动检测--------...因为子进程退出了,父进程暂时不知道 ---- 子进程要退出时,会向父进程发信号 SIGCHLD进程对于该信号处理动作是SIG_DFL 什么都不做 验证SIGCHLD存在 #include<stdio.h...0; } 实现一个自定义方法,当子进程退出时,会向父进程发送信号SIGCHLD 调用对应自定义方法,打印出对应信号以及父进程pid值 ---- 运行可执行程序后,whopid值就是父进程pid...17号信号就是SIGCHLD 同时通过waitpid返回pid值与子进程pid值相同 ---- 通过for循环创建出10个子进程,若10个子进程发送信号,处理信号需要一个一个处理,所以当发送一个信号时

14410
领券