【LinuxC语言】信号相关函数——kill、raise、pause与alarm

embedded/2024/9/25 10:27:53/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

class="toc">

文章目录

  • 前言
  • 一、函数介绍
    • 1.1 kill() 函数
    • 1.2 raise() 函数
    • 1.3 pause() 函数
    • 1.4 alarm() 函数
  • 总结


前言

在Linux环境下࿰c;信号是一种重要的进程间通信机制࿰c;用于处理异步事件和控制进程行为。除了使用signal函数来设置信号处理函数外࿰c;还有一些其他的信号相关函数࿰c;如kill、raise、pause和alarm࿰c;它们提供了更多的信号处理和管理功能。本文将介绍这些函数的基本概念和用法࿰c;帮助读者更好地理解信号处理在Linux编程中的应用。


一、函数介绍

1.1 kill() 函数

  • 原型: <code>int kill(pid_t pid, int sig);code>
  • 作用: 用于向指定的进程发送信号。
  • 参数:
    • <code>pidcode>:要发送信号的进程的 ID。
    • <code>sigcode>:要发送的信号的编号。
  • 返回值: 如果成功࿰c;则返回0;如果失败࿰c;则返回-1。
  • 示例代码:
    <code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
    class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><signal.h>
    class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><unistd.h>class="token keyword">int class="token function">mainclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token class-name">pid_t pid class="token operator">= class="token function">getpidclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 获取当前进程的 IDclass="token keyword">int result class="token operator">= class="token function">killclass="token punctuation">(pidclass="token punctuation">, SIGKILLclass="token punctuation">)class="token punctuation">; class="token comment">// 发送 SIGKILL 信号给当前进程class="token keyword">if class="token punctuation">(result class="token operator">== class="token number">0class="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Signal sent successfully.\n"class="token punctuation">)class="token punctuation">;class="token punctuation">} class="token keyword">else class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Failed to send signal.\n"class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token keyword">return class="token number">0class="token punctuation">;
    class="token punctuation">}
    code>

c="https://img-blog.csdnimg.cn/direct/1d6ee2fc348c427481a1f93d8baaf007.png#pic_center" alt="在这里插入图片描述" />

1.2 raise() 函数

  • 原型: <code>int raise(int sig);code>
  • 作用: 用于向当前进程发送信号。
  • 参数:
    • <code>sigcode>:要发送的信号的编号。
  • 返回值: 如果成功࿰c;则返回0;如果失败࿰c;则返回非0。
  • 示例代码:
    <code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
    class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><signal.h>class="token keyword">int class="token function">mainclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token keyword">int result class="token operator">= class="token function">raiseclass="token punctuation">(SIGINTclass="token punctuation">)class="token punctuation">; class="token comment">// 发送 SIGINT 信号给当前进程class="token keyword">if class="token punctuation">(result class="token operator">== class="token number">0class="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Signal sent successfully.\n"class="token punctuation">)class="token punctuation">;class="token punctuation">} class="token keyword">else class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Failed to send signal.\n"class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token keyword">return class="token number">0class="token punctuation">;
    class="token punctuation">}
    code>

c="https://img-blog.csdnimg.cn/direct/479dd4cdcc48472ca9ec88827b3496d0.png#pic_center" alt="在这里插入图片描述" />

1.3 pause() 函数

  • 原型: <code>int pause(void);code>
  • 作用: 让进程挂起࿰c;直到收到一个信号。
  • 参数: 无参数。
  • 返回值: 被信号中断时返回-1࿰c;否则不返回。
  • 示例代码:
    <code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
    class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><signal.h>class="token keyword">void class="token function">handlerclass="token punctuation">(class="token keyword">int sigclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Signal received.\n"class="token punctuation">)class="token punctuation">;
    class="token punctuation">}class="token keyword">int class="token function">mainclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token function">signalclass="token punctuation">(SIGINTclass="token punctuation">, handlerclass="token punctuation">)class="token punctuation">; class="token comment">// 设置信号处理函数class="token function">printfclass="token punctuation">(class="token string">"Waiting for signal...\n"class="token punctuation">)class="token punctuation">;class="token function">pauseclass="token punctuation">(class="token punctuation">)class="token punctuation">; class="token comment">// 挂起进程直到收到信号class="token function">printfclass="token punctuation">(class="token string">"Resuming after pause.\n"class="token punctuation">)class="token punctuation">;class="token keyword">return class="token number">0class="token punctuation">;
    class="token punctuation">}
    code>

c="https://img-blog.csdnimg.cn/direct/31dde7bafba44963a1fc46115660bacb.png#pic_center" alt="在这里插入图片描述" />

1.4 alarm() 函数

  • 原型: <code>unsigned int alarm(unsigned int seconds);code>
  • 作用: 设置一个定时器࿰c;在指定的秒数后发送 SIGALRM 信号给当前进程。
  • 参数:
    • <code>secondscode>:定时器的时长࿰c;以秒为单位。
  • 返回值: 返回上一个定时器剩余的秒数࿰c;如果之前没有定时器࿰c;则返回0。
  • 示例代码:
    <code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
    class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><unistd.h>
    class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><signal.h>class="token keyword">void class="token function">handlerclass="token punctuation">(class="token keyword">int sigclass="token punctuation">) class="token punctuation">{class="token function">printfclass="token punctuation">(class="token string">"Alarm triggered.\n"class="token punctuation">)class="token punctuation">;
    class="token punctuation">}class="token keyword">int class="token function">mainclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token function">signalclass="token punctuation">(SIGALRMclass="token punctuation">, handlerclass="token punctuation">)class="token punctuation">; class="token comment">// 设置信号处理函数class="token keyword">unsigned class="token keyword">int remaining class="token operator">= class="token function">alarmclass="token punctuation">(class="token number">5class="token punctuation">)class="token punctuation">; class="token comment">// 设置定时器为5秒࿰c;并获取之前的剩余时间class="token function">printfclass="token punctuation">(class="token string">"Waiting for alarm...\n"class="token punctuation">)class="token punctuation">;class="token function">sleepclass="token punctuation">(class="token number">10class="token punctuation">)class="token punctuation">; class="token comment">// 睡眠10秒࿰c;等待触发定时器class="token function">printfclass="token punctuation">(class="token string">"Resuming after alarm.\n"class="token punctuation">)class="token punctuation">;class="token keyword">return class="token number">0class="token punctuation">;
    class="token punctuation">}
    code>

c="https://img-blog.csdnimg.cn/direct/9e7e3d75f7d04f98948a9e8186bcb38d.png#pic_center" alt="在这里插入图片描述" />


总结

通过学习kill、raise、pause和alarm等信号相关函数࿰c;我们扩展了对信号处理和管理的认识。这些函数可以让我们更灵活地控制信号的发送、处理和等待࿰c;从而实现更复杂的信号交互和进程控制逻辑。然而࿰c;在使用这些函数时࿰c;需要注意理解它们的功能和用法࿰c;以避免不必要的错误和问题。综上所述࿰c;信号相关函数是Linux编程中不可或缺的重要工具࿰c;熟练掌握它们将有助于编写更加健壮和高效的程序。


http://www.ppmy.cn/embedded/33152.html

相关文章

C语言:文件操作(下)

片头 嗨&#xff01;小伙伴们&#xff0c;在前2篇中&#xff0c;我们分别讲述了C语言&#xff1a;文件操作&#xff08;上&#xff09;和 C语言&#xff1a;文件操作&#xff08;中&#xff09;&#xff0c;今天我们将会学习文件操作&#xff08;下&#xff09;&#xff0c;准…

模型智能体开发之metagpt-多智能体实践

参考&#xff1a; metagpt环境配置参考模型智能体开发之metagpt-单智能体实践 需求分析 之前有过单智能体的测试case&#xff0c;但是现实生活场景是很复杂的&#xff0c;所以单智能体远远不能满足我们的诉求&#xff0c;所以仍然还需要了解多智能体的实现。通过多个role对动…

奇门辅助软件v2024.5

废话不说&#xff0c;先上链接 链接&#xff1a;https://pan.baidu.com/s/1_i11lMx4P_vrTs-6lpWoHA?pwd8v1m 提取码&#xff1a;8v1m 功能介绍 【宫内信息】是点击宫内某属性时显示的宫内基本信息。 【古籍宝鉴】是《御定奇门宝鉴》里的对应时局内容&#xff0c;但差补法置…

探秘STM32内部FLASH的读写操作

探秘STM32内部FLASH的读写操作 在STM32嵌入式系统开发中&#xff0c;内部FLASH是一个重要的存储器&#xff0c;用于存储程序代码和数据。了解如何进行内部FLASH的读写操作对于开发者来说至关重要&#xff0c;可以帮助他们实现数据的存储与更新。本文将深入探讨STM32内部FLASH的…

《MySQL45讲》读书笔记

重建表 alter table t engine InnoDB&#xff08;也就是recreate&#xff09;&#xff0c;而optimize table t 等于recreateanalyze&#xff0c;让表大小变小 重建表的执行流程 建立一个临时文件&#xff0c;扫描表 t 主键的所有数据页&#xff1b;用数据页中表 t 的记录生…

647. 回文子串

647. 回文子串 题目链接&#xff1a;647. 回文子串 代码如下&#xff1a; class Solution { public:int countSubstrings(string s) {int res0;//布尔类型的dp[i][j]:表示区间范围[i,j](注意是左闭右闭)的子串是否是回文子串vector<vector<bool>> dp(s.size(),v…

排序算法--快速排序

前提&#xff1a; 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分…

vue什么是服务端渲染(SSR)

Vue服务端渲染&#xff08;SSR&#xff09;在优化SEO方面有着显著的优势&#xff0c;因为它允许搜索引擎直接访问服务器渲染的页面&#xff0c;从而更容易解析页面内容。以下是一些关于如何使用Vue SSR优化SEO的建议&#xff1a; 为每个URL生成静态HTML&#xff1a;Vue SSR允许…