首页 > 其他分享 >第六章信号与信号处理

第六章信号与信号处理

时间:2022-10-29 23:12:26浏览次数:60  
标签:int 信号处理 pid 6.7 进程 信号 printf 第六章

第六章信号与信号处理

  • 6.1信号和中断
    由I/O设备或者协议处理器发送到外部请求,它将CPU从正常执行转移到中断处理。
    (1)人员中断,人员再次上线后能够继续之前的事项
    (2)进程中断,来源如下
    1.硬件中断
    2.来自其他进程
    3.自己造成(除以0,无效地址)
    (3)硬件中断,情况如下
    1.来自硬件
    2.来自其他处理器的中断
    3.自己造成
    (4)进程的陷阱错误
  • 6.2Unix/Linux信号示例
    (1)Ctrl+C 终止当前进程。键盘中断处理程序将Ctrl+C转换成SIGINT(2)信号,发送给终端上的进程。在内核模式下,每个进程都要检查和处理未完成的信号,进程对绝大多数信号是调用系统内核的kexit(exitValue)函数来终止。Linux中exitValue的低位字节是导致进程终止的信号。
    (2)Nohup a.out &命令在后台运行一个程序。及时用户退出程序依然执行。忽略SIGINT(1)信号。当用户退出时sh会向子程序发送SIGHUP信号,子程序忽略之。
    (3)Kill pid (or kill -s 9 pid)杀死进程,执行杀死的进程向pid标识的目标发送SIGTERM(15)信号,请求它死亡。如果拒绝使用括号中的强制执行。
  • 6.3 Unix/Linux中的信号处理
    (1)型号类型(signal.h)

(2)信号来源
·硬件中断
1.中断键SIGINT(2)
2.间隔定时器SIGALRM(14)、SIGVTALRM(26)、SIGPROF(27)
3.总线错误、IO陷阱

·异常
如通常陷阱信号SIGEPE(8)表示除以0,SIGSEGV(11)段错误

·其他进程
进程使用kill(pid,sig)。杀死无限循环进程。


(3)进程PROC结构体中的信号
每个进程PROC都有一个32位的向量,用来记录发送给程序的信号。位向量中每一位表示信号编号(0位除外),一个信号MASK位向量,用来屏蔽相应信号,使用sigmask、sigsetmask、siggetmask、sigblock等来设置、清除、检查MASK信号。
(4)信号处理函数
信号处理数组int sig[32]。数组每个条目都指定了如何处理相应的信号,0表示默认,1表示忽略,其他非0值表示用户模式下预先安装的信号捕捉函数。

(5)安装信号捕捉函数
进程系统调用

修改选定信号编号的处理函数,SIGKILL(9)和SIGSTOP(19)除外。已安装的处理函数一定是以下形式用户空间中信号捕捉函数的入口:

1.执行已安装的信号捕捉函数之前,通常将信号设置为默认。为捕捉下次出现的相同信号,必须重新安装捕捉系统。

实例

点击查看代码
#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>
void handler(int sig,siginfo_t *siginfo,void *context)
{
	printf("handler:sif=%d from PID=%d UID=%d\n",sig,siginfo->si_pid,siginfo->si_uid);
}

int main(int argc,char *argv[])
{
	struct sigaction act;
	memset(&act,0,sizeof(act));
	act.sa_sigaction = &handler;//添加响应函数
	act.sa_flags = SA_SIGINFO;
	sigaction(SIGTERM,&act,NULL);//将行为act放入响应处理机制
	printf("proc PID=%d looping\n",getpid());
	printf("enter kill PID to send SIGTERM signal to it\n");
	while(1)//一直循环
	{
		sleep(10);
	}
}
**运行结果** ![](/i/l/?n=22&i=blog/2171853/202210/2171853-20221029230521794-630420539.png)

·函数调用和命令

  • 6.4信号处理步骤
    (1)当某进程处于内核模式是,会检查并处理未完成的信号。
    (2)重置用户安装的信号捕捉器。
    (3)信号和唤醒。

  • 6.5信号与异常
    Unix设计最初用途如下

  • 6.7信号做为IPC

  • 6.7 Linux中的IPC
    进程之间通信的机制。

  • 6.7.1管道和FIFO

  • 6.7.2信号

  • 6.7.3System V IPC
    在POSIX标准下,包括共享内存、信号量和消息队列。

  • 6.7.4 POSIX消息队列
    类似于System V IPC的消息队列,更通用且具有移植性

  • 6.7.5线程同步机制
    Linux不区分进程和线程。在Linux中,进程共享某些公共资源的线程。如果是使用共享地址空间的clone()系统调用创建的线程,他们通过共享内存进行通信。

  • 6.7.6 套接字
    跨网络通信的的IPC机制。

  • 6.8编程项目

点击查看代码
#include<stdio.h>
#include<signal.h>
#include<fcntl.h>
#include<string.h>

#define LEN 64
int ppipe[2];
int pid;
char line[LEN];
int parent()
{
	printf("parent %d running \n",getpid());
	close(ppipe[0]);
	while(1)
	{
	printf("parent %d:input a line :\n",getpid());
	fgets(line,LEN,stdin);
	line[strlen(line)-1] = 0; // kill the \n at and
	printf("parent %d write to pipe\n",getpid());
	write(ppipe[1],line,LEN);
	printf("printf %d send signal 10 to %d\n",getpid(),pid);
	kill(pid,SIGUSR1);
	}
}

void chandler(int sig)
{
printf("\nchild %d got an interrupt sig=%d\n",getpid(),sig);
read(ppipe[0],line,LEN);
printf("child %d get a message =%s\n",getpid(),line);
}
int child()
{
	char msg[LEN];
	int parent = getppid();
	printf("child %d running \n",getpid());
	close(ppipe[1]);
	signal(SIGUSR1,chandler);
	while(1);
}

int main()
{
	pipe(ppipe);
	pid = fork();
	if(pid) parent();
	else child();
}
**运行结果**




标签:int,信号处理,pid,6.7,进程,信号,printf,第六章
From: https://www.cnblogs.com/JIANGJININ/p/16840158.html

相关文章

  • C6678+K7+AD9253/AD9783 8路AD高速信号处理板
    C6678+K7+AD9253/AD97838路信号处理板介绍功耗≤35W重量≤150g尺寸105mm*180mm供电电压:5V所选用器件都是进口工业级A/D:         2片AD9253(125MHz采样,共8路同轴......
  • 20201220蔡笃俊《信息安全系统设计与实现》第六章学习笔记
    一、任务内容自学教材第6章,提交学习笔记(10分)知识点归纳以及自己最有收获的内容(3分)问题与解决思路(2分)实践内容与截图,代码链接(3分)...(知识的结构化,知识的完整性等,提交m......
  • c#Winform自定义控件-信号灯(工业)-HZHControls UCSignalLamp 使用
     想要官网这个效果,自己琢磨了下,记录一下   一、拖一个UCSignalLamp控件   二、设置指示灯的属性//设置指示灯颜色(不闪烁只用写一个......
  • 第5题:试设计一巴特沃斯低通滤波器,其处理的数据采样率为2Hz,允许0.6Hz以下的信号通过。
    首先对题目进行分析,采样率为2Hz,允许0.6Hz以下信号通过说明该滤波器的截止频率为0.6,也就是幅频增益下降3dB或者是最大幅频增益的0.707倍(对应的是根号2分之一)题目的意思应该......
  • 用esp8266向外界发送网络信号
    #include<ESP8266WiFi.h>constchar*ssid="fengzhihean";constchar*password="12345678";voidsetup(){Serial.begin(115200);WiFi.softAP(ssid,password);......
  • 数字信号的简单问题(一)
    最近在复习信号处理时,发现一个很白痴的问题,是一个初学者容易犯的错误,但还是要说一说。线性时不变系统(滤波器)的幅频特性,一般只描述了PI到-PI范围。按照常理来说应该是正无......
  • 信号量与互斥锁之间的区别
    (1):互斥量用于线程的互斥,信号线用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。(2):互斥量值只能为0/1,信号量值可以为非负整数。也就是说,一个互......
  • ADC采样信号RMS测量值的Verilog实现
    术语“RMS”代表“Root-Mean-Squared”。大多数书籍将此定义为“产生与等效直流电源相同的加热效果的交流电量”,或者沿着这些线路类似的东西,但RMS值不仅仅是这个。RMS......
  • 《STM32MP1 M4裸机HAL库开发指南》第六章 新建MDK工程
    第六章新建MDK工程​本教程所有例程都是在MDK下编写、编译和调试的,因此首先要学习的就是如何新建MDK工程,本章就来讲解一下最基本的MDK工程创建方法,工程创建成功以后用汇编......
  • 第六章 函数
    6.1函数基础调用函数:函数的调用将完成两项工作,一是实参初始化函数对应的形参;二是控制权从从主调函数转移到被调函数,主调函数的执行被中断,被调函数开始执行。当函数遇到ret......