当前位置: 首页 > news >正文

嵌入式Linux:向进程发送信号

目录

1、kill()函数

2、killpg()函数

3、raise()函数


在 Linux 系统中,进程可以通过 kill() 系统调用向其他进程发送信号。除了 kill(),系统还提供了 killpg()raise() 这两个函数,它们也可以用于发送信号。

1、kill()函数

kill() 函数用于向指定的进程或进程组中的每个进程发送信号。

函数原型如下:

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

参数说明

  • pid: 目标进程或进程组的 ID。
    • 如果 pid 为正数,则信号 sig 发送到 PID 指定的进程。
    • 如果 pid 为 0,则信号发送到当前进程组中的每个进程。
    • 如果 pid 为 -1,则信号发送到系统中所有可以发送信号的进程(但不包括进程 1,即 init)。
    • 如果 pid 小于 -1,则信号发送到 ID 为 -pid 的进程组中的每个进程。
  • sig: 要发送的信号。如果 sig 为 0,则仅进行错误检查,不实际发送信号。

返回值

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno

在以下面的示例中,父进程创建了一个子进程,等待 5 秒后,使用 kill() 向子进程发送 SIGKILL 信号以终止它。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程while (1) {printf("Child process running...\n");sleep(1);}} else {// 父进程sleep(5);printf("Sending SIGKILL to child process...\n");kill(pid, SIGKILL);  // 向子进程发送 SIGKILL 信号wait(NULL);  // 等待子进程结束}return 0;
}

2、killpg()函数

killpg() 函数用于向指定进程组中的每个进程发送信号。该函数并不在所有 Unix 系统中都可用,但在 Linux 中较为常见。

函数原型如下:

#include <signal.h>
int killpg(pid_t pgrp, int sig);

参数说明

  • pgrp: 目标进程组的 ID。通常使用负数来指定进程组的 ID。
  • sig: 要发送的信号。

返回值

  • 成功时返回 0。
  • 失败时返回 -1,并设置 errno

在以下示例中,父进程和子进程在同一进程组中。父进程在等待 5 秒后,使用 killpg() 向进程组发送 SIGTERM 信号。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>int main() {pid_t pgrp = getpgrp();  // 获取当前进程组 IDprintf("Current process group ID: %d\n", pgrp);// 创建一个子进程pid_t pid = fork();if (pid == 0) {// 子进程while (1) {printf("Child process in group %d\n", getpgrp());sleep(1);}} else {// 父进程sleep(5);printf("Sending SIGTERM to process group...\n");killpg(pgrp, SIGTERM);  // 向进程组发送 SIGTERM 信号wait(NULL);  // 等待子进程结束}return 0;
}

3、raise()函数

raise() 函数用于向当前进程发送信号。

函数原型如下:

#include <signal.h>
int raise(int sig);

参数说明

  • sig: 要发送的信号。

返回值

  • 成功时返回 0。
  • 失败时返回非零值。

以下示例中,进程通过 raise() 向自身发送 SIGINT 信号,这会触发信号处理函数 signal_handler

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>void signal_handler(int sig) {printf("Caught signal %d\n", sig);
}int main() {signal(SIGINT, signal_handler);  // 设置信号处理函数printf("Raising SIGINT\n");raise(SIGINT);  // 向当前进程发送 SIGINT 信号return 0;
}

http://www.mrgr.cn/news/28197.html

相关文章:

  • html数据类型
  • Python小游戏24——小恐龙躲避游戏
  • Springboot校园失物招领平台
  • Docker+Django项目部署-从Linux+Windows实战
  • 关于10款PDF编辑工具我的使用体验!!!!!
  • 安全见闻-泷羽sec课程笔记
  • 大模型笔记03--快速体验dify
  • dedecms靶场(四种webshell姿势)
  • 【Go】Go语言中的数组基本语法与应用实战
  • 建模杂谈系列256 规则函数化改造
  • 速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器
  • 【C++】多态
  • dedecms(四种webshell姿势)aspcms webshell漏洞复现
  • 从冯唐的成事心法 看SAP协助企业战略落地到信息化
  • kubernetes中pause容器的作用与源码详解
  • 神经网络_使用tensorflow对fashion mnist衣服数据集分类
  • OpenGL笔记二十一之几何类设计
  • 数组学习内容
  • 基于深度学习,通过病理切片直接预测HPV状态|文献速递·24-09-16
  • 进程间关系和守护进程
  • AG32 MCU的引脚特点及功耗说明
  • AIP接口调用
  • 8. Transforms的使用(三)-- Resize
  • 【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)
  • keil5进行stm32编程时常遇到的问题和ST-LINK在线仿真的连接问题
  • 哈哈哈,让 GitHub Copilot 用上 deepseek,性能不输 GPT-4,每月立即省 10 刀!