第2章 Linux多进程开发 2.19-2.23 与信号相关的函数

在这里插入图片描述
在这里插入图片描述

软件中断:
在这里插入图片描述
在这里插入图片描述

信号名称(宏不会变),编号在不同的版本可能会变:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

core保存进程异常退出的信息:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

core.c:

#include <stdio.h>
#include <string.h>int main() {char * buf; // 指针 没有指向合法的内存   会产生段错误strcpy(buf, "hello");return 0;
}

kill.c:

/*  #include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);- 功能:给任何的进程或者进程组pid, 发送任何的信号 sig- 参数:- pid :> 0 : 将信号发送给指定的进程= 0 : 将信号发送给当前的进程组= -1 : 将信号发送给每一个有权限接收这个信号的进程< -1 : 这个pid=某个进程组的ID取反 (-12345)- sig : 需要发送的信号的编号或者是宏值,0表示不发送任何信号 编号可能会变 但宏值不会变kill(getppid(), 9);kill(getpid(), 9);int raise(int sig);- 功能:给当前进程发送信号- 参数:- sig : 要发送的信号- 返回值:- 成功 0- 失败 非0kill(getpid(), sig);   void abort(void);- 功能: 发送SIGABRT信号给当前的进程,杀死当前进程kill(getpid(), SIGABRT);
*///演示kill
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>int main() {pid_t pid = fork();if(pid == 0) {  //多进程是去抢夺CPU的执行权 父进程先执行还是子进程先执行 要抢占// 子进程int i = 0;for(i = 0; i < 5; i++) {printf("child process\n");sleep(1);}} else if(pid > 0) {// 父进程printf("parent process\n");sleep(2);printf("kill child process now\n");kill(pid, SIGINT);}return 0;
}

alarm.c: 只能定时一次
alarm作为定时器:时间过后,终止进程,返回剩余时间,每个进程只有一个定时器,想要停止定时器(传递个0)

// 1秒钟电脑能数多少个数?
#include <stdio.h>
#include <unistd.h>/*实际的时间 = 内核时间 + 用户时间 + 消耗的时间进行文件IO操作的时候比较浪费时间定时器,与进程的状态无关(自然定时法)。无论进程处于什么状态,alarm都会计时。
*/int main() {    alarm(1);int i = 0;while(1) {printf("%i\n", i++);}return 0;
}

setitimer.c:(读音:set i timer) 与alarm的区别是能周期性定时

/*#include <sys/time.h>int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);- 功能:设置定时器(闹钟)。可以替代alarm函数。精度微妙us,可以实现周期性定时- 参数:- which : 定时器以什么时间计时ITIMER_REAL: 真实时间,时间到达,发送 SIGALRM   常用ITIMER_VIRTUAL: 用户时间,时间到达,发送 SIGVTALRMITIMER_PROF: 以该进程在用户态和内核态下所消耗的时间来计算,时间到达,发送 SIGPROF- new_value: 设置定时器的属性  是个结构体struct itimerval {      // 定时器的结构体struct timeval it_interval;  // 每个阶段的时间,间隔(interval)时间struct timeval it_value;     // 延迟多长时间执行定时器};struct timeval {        // 时间的结构体time_t      tv_sec;     //  秒数     suseconds_t tv_usec;    //  微秒    };过10秒后,每个2秒定时一次- old_value :记录上一次的定时的时间参数,一般不使用,指定NULL- 返回值:成功 0失败 -1 并设置错误号
*/#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>// 过3秒以后,每隔2秒钟定时一次
int main() {struct itimerval new_value;// 设置间隔的时间new_value.it_interval.tv_sec = 2;new_value.it_interval.tv_usec = 0;// 设置延迟的时间,3秒之后开始第一次定时new_value.it_value.tv_sec = 3;new_value.it_value.tv_usec = 0;int ret = setitimer(ITIMER_REAL, &new_value, NULL); // 非阻塞的  ITIMER_REAL 默认去终止进程,所以没法周期性定时,需要信号捕捉,才能周期性定时printf("定时器开始了...\n");    //他立马打印,并没有延迟三秒,说明是非阻塞的if(ret == -1) {perror("setitimer");exit(0);}getchar();return 0;
}

在这里插入图片描述

signal.c:

/*#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);- 功能:设置某个信号的捕捉行为- 参数:- signum: 要捕捉的信号- handler: 捕捉到信号要如何处理- SIG_IGN : 忽略信号- SIG_DFL : 使用信号默认的行为 (相当于没有捕捉)- 回调函数 :  这个函数是内核调用,程序员只负责写,捕捉到信号后如何去处理信号。回调函数:- 需要程序员实现,提前准备好的,函数的类型根据实际需求,看函数指针的定义- 不是程序员调用,而是当信号产生,由内核调用- 函数指针是实现回调的手段,函数实现之后,将函数名放到函数指针的位置就可以了。- 返回值:成功,返回上一次注册的信号处理函数的地址。第一次调用返回NULL失败,返回SIG_ERR,设置错误号SIGKILL(强制杀死某个进程,要是能捕捉,可以搞病毒了) SIGSTOP不能被捕捉,不能被忽略。
*/#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>void myalarm(int num) {printf("捕捉到了信号的编号是:%d\n", num);printf("xxxxxxx\n");
}// 过3秒以后,每隔2秒钟定时一次
int main() {// 注册信号捕捉  要写在最前面// signal(SIGALRM, SIG_IGN);// signal(SIGALRM, SIG_DFL);// void (*sighandler_t)(int); 函数指针,int类型的参数表示捕捉到的信号的值。signal(SIGALRM, myalarm);struct itimerval new_value;// 设置间隔的时间new_value.it_interval.tv_sec = 2;new_value.it_interval.tv_usec = 0;// 设置延迟的时间,3秒之后开始第一次定时new_value.it_value.tv_sec = 3;new_value.it_value.tv_usec = 0;int ret = setitimer(ITIMER_REAL, &new_value, NULL); // 非阻塞的printf("定时器开始了...\n");if(ret == -1) {perror("setitimer");exit(0);}getchar();return 0;
}

在这里插入图片描述
在这里插入图片描述

回调函数:
回调函数(Callback Function)是一种特殊类型的函数,它作为参数传递给另一个函数,并在特定的事件发生或条件满足时由另一个函数来调用。当满足一定条件时,被调用的函数将执行特定的操作或逻辑。

回调函数的使用可以实现灵活的控制流和事件处理机制。常见的应用场景包括事件驱动编程、异步编程、GUI 编程以及处理回调接口等。

回调函数的特点如下:
函数作为参数传递:回调函数通常作为另一个函数的参数传递。这样,调用者可以决定在何时调用回调函数。
非阻塞执行:回调函数通常在某个事件触发或条件满足时被调用,因此不会阻塞程序的执行。
逻辑分离:将特定的操作或逻辑封装在回调函数中,可以使代码更加模块化和可维护。

具体来说,回调函数的用法如下:
定义回调函数:编写一个函数,其中包含特定的操作或逻辑,用于在特定条件下被调用。
注册回调函数:将回调函数作为参数传递给另一个函数,并在合适的时机注册该回调函数。
触发回调:当满足特定的条件时,调用者会触发回调函数,从而执行相应的操作。
回调函数通常用于异步编程、事件处理和处理非线性控制流等情况下。通过使用回调函数,可以将程序的控制权交给调用者,使得程序能够更加灵活和可扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/96074.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机怎么剪视频?分享一些剪辑工具和注意事项

视频剪辑是一种将多个视频片段进行剪切、合并和编辑的技术&#xff0c;它可以帮助我们制作出精彩的视频作品。如今&#xff0c;随着智能手机的普及&#xff0c;我们可以随时随地使用手机进行视频剪辑。本文将为大家介绍一些手机剪辑工具和注意事项&#xff0c;帮助大家更好地进…

代码随想录训练营第四十三天|1049. 最后一块石头的重量 II、 494. 目标和、 474.一和零

1049. 最后一块石头的重量 II 力扣题目链接(opens new window) 题目难度&#xff1a;中等 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x &l…

MATLAB制图代码【第二版】

MATLAB制图代码【第二版】 文档描述 Code describtion: This code is version 2 used for processing the data from the simulation and experiment. Time : 2023.9.3 Author: PEZHANG 这是在第一版基础上&#xff0c;迭代出的第二版MATLAB制图代码&#xff0c;第二版的特点是…

纵行科技与山鹰绿能达成合作,提供物联网资产管理数据服务

近日&#xff0c;纵行科技与山鹰绿能宣布双方达成深度合作关系&#xff0c;纵行科技将为山鹰绿能提供专业的物联网技术服务&#xff0c;使用物联网技术帮助山鹰绿能对循环包装载具等资产进行在线管理和数字化运营。 据悉&#xff0c;山鹰绿能是一家由山鹰国际控股的全资子公司…

4、DVWA——文件包含

文章目录 一、文件包含概述二、low2.1 源码分析2.2 通关分析 三、medium3.1 源码分析3.2 通关思路 四、high4.1 源码分析4.2 通关思路 五、impossible 一、文件包含概述 文件包含是指当服务器开启allow_url_include选项时&#xff0c;就可以通过php的某些特性函数&#xff08;i…

解决Jackson解析JSON时出现的Illegal Character错误

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

如何在Spring Boot应用中使用Nacos实现动态更新数据源

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

飞腾平台芯片测试固件(SFW)和开机启动log

一、说两句 最近公司飞腾产品越来越多了&#xff0c;FT-2000/4的D2000的X100的&#xff0c;最近又新出了E2000。越来越多新来的小孩儿开始加入到飞腾的调测试中&#xff0c;那么在他们实际的调试中会遇到很多的问题。在固件启动阶段有的板卡会有一些异常&#xff0c;有时我们需…

Java-API简析_java.net.Inet4Address类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/132643590 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

单目标应用:基于麻雀搜索算法SSA的微电网优化调度MATLAB

一、微网系统运行优化模型 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、麻雀搜索算法简介 麻雀搜索算法 (Sparrow Search Algorithm, SSA) 是一种新型的群智能优化算法&#xff0c;于2020…

C++------vector【STL】

文章目录 vector的介绍及使用vector的介绍vector的使用 vector的模拟实现 vector的介绍及使用 vector的介绍 1、vector是表示可变大小数组的序列容器。 2、就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问和数…

尚硅谷SpringMVC (5-8)

五、域对象共享数据 1、使用ServletAPI向request域对象共享数据 首页&#xff1a; Controller public class TestController {RequestMapping("/")public String index(){return "index";} } <!DOCTYPE html> <html lang"en" xmln…