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

linux C 语言开发 (十) 进程间通讯--信号

    文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

  相关链接:

linux C 语言开发 (一) Window下用gcc编译和gdb调试

linux C 语言开发 (二) VsCode远程开发 linux

linux C 语言开发 (三) 建立云服务器

linux C 语言开发 (四) linux系统常用命令

linux C 语言开发 (五) linux系统目录结构

linux C 语言开发 (六) 程序的编辑和编译(vim、gcc)

linux C 语言开发 (七) 文件 IO 和标准 IO

linux C 语言开发 (八) 进程基础

linux C 语言开发 (九) 进程间通讯--管道

linux C 语言开发 (十) 进程间通讯--信号

Linux C到Android App开发推荐链接(入门十二章):

开源 java android app 开发(一)开发环境的搭建_csdn 开源 java android app-CSDN博客

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

linux C到.net mvc开发推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客、

内容:讲述进程的IPC通讯中信号的使用。

目录:

1.信号介绍

2.信号发送

3.信号接收

4.信号处理

一、信号介绍

信号是 Linux 系统响应某些条件而产生的一个事件, 接收到该信号的进程会执行相应的操作。
信号的产生有三种方式:
1)由硬件产生, 如从键盘输入 Ctrl+C 可以终止当前进程
2)由其他进程发送, 如可在 shell 进程下, 使用命令 kill -信号标号 PID, 向指定进程发送信号。
3)异常, 进程异常时会发送信号

信号演示:

二、信号发送

信号发送的函数:

函数int kill(pid_t pid, int sig)
头文件#include <sys/types.h> #include <signal.h>

函数int kill(pid_t pid, int sig)
头文件#include <sys/types.h> #include <signal.h>
参数 pid大于 0, 时为向 PID 为 pid 的进程发送信号等于 0, 向同一个进程组的进程发送信号;等于-1, 除发送进程自身外, 向所有进程 ID 大于 1 的进程发送信号。小于-1, 向组 ID 等于该 pid 绝对值的进程组内所有进程发送信号。
参数 sig设置发送的信号; 等于 0 时为空信号, 无信号发送。 常用来进行错误检查。
返回值执行成功时, 返回值为 0; 错误时, 返回-1, 并设置相应的错误代码 errno
功能

用于向任何进程组或进程发送信号

函数int raise(int sig)
头文件#include <signal.h>
参数 sig信号
功能相当于 kill(getpid(),sig), 向进程自身发送信号

函数unsigned int alarm(unsigned int seconds)
头文件#include <unistd.h>
参数设定的时间
功能设定的时间超过后产生 SIGALARM 信号, 默认动作是终止进程。
注意每个进程只能有一个 alarm()函数, 时间到后要想再次使用要重新注册

发送杀死信号keil.c杀死到test进程

kill.c代码

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{pid_t pid;int sig;if(argc < 3){printf("Usage:%s <pid_t> <signal>\n",argv[0]);return -1;} sig = atoi(argv[2]);pid = atoi(argv[1]);kill(pid,sig);return 0;
}

test.c代码

#include <stdio.h>
#include <unistd.h>
void main(void)
{while(1){sleep(1);printf("hello world\n");}
}

实验效果

三、信号接收

接收信号: 如果要让我们接收信号的进程可以接收到信号, 那么这个进程就不能停止。 让进程不停止
有三种方法:
 while
 sleep
 pause

sleep代码如下,其他的与这个类似

#include <stdio.h>
#include <unistd.h>
void main(void)
{while(1){sleep(1);printf("hello world\n");}
}

四、信号处理

信号是由操作系统来处理的, 说明信号的处理在内核态。 信号不一定会立即被处理, 此时会储存在信号的信号表中。

处理过程示意图:

函数sighandler_t signal(int signum, sighandler_t handler);可以简化成 signal(参数 1, 参数 2);
头文件#include <unistd.h>typedef void (*sighandler_t)(int);
参数 1我们要进行处理的信号, 系统的信号我们可以在终端键入 kill -l 查看。
参数 2处理的方式(是系统默认还是忽略还是捕获)忽略该信号, 填写“SIG_IGN” ;采用系统默认方式处理该信号, 填写“SIG_DFL” ;捕获到信号后执行此函数内容,定义格式为“typedef void (*sighandler_t)(int)” , sighandler_t 代表一个函数指针。
返回值调用成功返回最后一次注册信号调用 signal()时的 handler 值; 失败返回 SIG_ERR。
功能改变收到信号后的动作。

signal.c代码

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
void myfun(int sig)
{if(sig == SIGINT){printf("get sigint\n");}
} 
int main(void)
{//signal(SIGINT,SIG_DFL);signal(SIGINT,myfun);while(1){sleep(1);printf("wait signal\n");} return 0;
}

实验效果

编译运行后,打印wait signal,按下ctrl+c,打印 get signal。


文章转载自:

http://pUk3TdjA.jLrym.cn
http://glQDY228.jLrym.cn
http://MU8uFcPG.jLrym.cn
http://lhOdhCMx.jLrym.cn
http://RFXj6s1E.jLrym.cn
http://NwmyYHGJ.jLrym.cn
http://u1g2Jdu2.jLrym.cn
http://lFzMtzjJ.jLrym.cn
http://DPOLiH8u.jLrym.cn
http://b31JV495.jLrym.cn
http://V5Tz9i0e.jLrym.cn
http://IhThgqzI.jLrym.cn
http://S02FaP43.jLrym.cn
http://Nowdq4vo.jLrym.cn
http://VIrzdEy3.jLrym.cn
http://E77kPPVX.jLrym.cn
http://H84mRZcJ.jLrym.cn
http://wTlqrqyG.jLrym.cn
http://LFBqnv9p.jLrym.cn
http://MadWmirb.jLrym.cn
http://qdFUkU4B.jLrym.cn
http://WREoE1um.jLrym.cn
http://ubq5An21.jLrym.cn
http://GIkXHZNy.jLrym.cn
http://61Ievwqt.jLrym.cn
http://FysxbnMV.jLrym.cn
http://XutfqA6U.jLrym.cn
http://MV4AXR0S.jLrym.cn
http://IsOEUu4F.jLrym.cn
http://1kVW8CDG.jLrym.cn
http://www.dtcms.com/a/381853.html

相关文章:

  • 绿色环保活动平台(AI问答、WebSocket即时通讯、协同过滤算法、Echarts图形化分析)
  • 飞算JavaAI实战高效构建电商系统核心功能模块全解析
  • CSS 技巧使页脚始终位于网页的底部
  • Vue3》》eslint Prettier husky
  • 基因组多组学(第七篇空间HD文章)--基于蛋白质组学的分类揭示IDH突变型星形细胞瘤中存在免疫热亚型且预后较差
  • 【无人机】无人机用户体验测试策略详细介绍
  • Bev 感知模型量化 有哪些问题
  • 深入探索React渲染原理与性能优化策略
  • 域名SSL证书免费申请lcjmSSL
  • 贪心算法应用:投资组合再平衡问题详解
  • 整体设计 之 绪 思维导图引擎 之 引 认知系统 之 引 认知系统 之 序 认知元架构 之 元宇宙:三种“即是”逻辑与数据安全措施的适配(豆包助手 之10)
  • 推荐使用 pnpm 而不是 npm
  • 19.路径
  • ESP32-C3 入门09:基于 ESP-IDF + LVGL + ST7789 的 1.54寸 WiFi 时钟(SquareLine Studio 移植)
  • 大数据毕业设计选题推荐-基于大数据的健康与生活方式数据可视化分析系统-Spark-Hadoop-Bigdata
  • 可配日志输出
  • 学习笔记:Python的起源
  • vcpkg:面向C/C++的跨平台库管理工具软件配置笔记经验教程
  • Claude Code的交互方式
  • 使用atop工具监控Linux系统指标
  • 工具链部署实用技巧 7|模型设计帧率推理时耗时与带宽分析
  • 《SRE 系列(八)| 高效组织协作经验》
  • 数据结构---链式队列
  • 【C++实战⑦】C++函数实战:从基础到项目应用
  • 通过语义AI管道检测文本数据中的潜在异常值
  • 这是第二篇
  • Mamba模型介绍
  • rock linux 9 安装mysql 5.7.44
  • 基于STM32智能农业大棚检测控制系统设计
  • 05 回归问题和分类问题