unix进程创建使用 第三讲

进程的中断

中止当前只在执行的进程,而去执行其他的任务。中断分为两种:一种来自硬件设备的中断,另一种来自其他程序的中断。
信号是一种软中断,可以把他看作是进程与进程、内核与进程通信的一种方式。

常见的一些信号

	SIGINT(2)	终端中断信号Ctrl+c
	SIGQUIT(3)	终端退出信号Ctrl+/ 
	SIGABRT(6)	调用abort函数产生的信号
	SIGFPE(8)	算术信号
	SIGKILL(9)	死亡信号
	SIGSEGV(11) 段错误信号
	SIGALRM(14) 闹钟信号
	SIGCHLD(17) 子进程结束信号
	SIGCONT(18) 进程继续信号
	SIGSTOP(19) 进程暂停信号
	SIGTSTP(20) 终端停止信号

编号小于SIGRGMI(34)的信号都是不可靠的,位于[SIGRGMI(34),SIGRTMAX(64)]区间的都是可靠信号。可靠信号支持排除,不会丢失。

信号的处理方式

1、忽略
2、终止
3、终止+core

	core dump 把内存的使用情况扔出来。
	core文件是一种二进制文件,需要一些高度工具才能解析出来(gdb)。
	1、gcc -g code.c -> 生成带调试信息的可执行文件。
	2、运行可执行文件产生core文件
	3、gdb ./a.out core 程序会停止在产生错误的位置。

信号的捕获和处理

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t  signal(int  signum, sighan‐dler_t handler);
功能:向注册一个信号处理函数
signum:信号的编号,可以直接写数字,也可以使用系统提供的宏。
handler:函数指针
	SIG_IGN 忽略信号
	SIG_DFL 恢复信号默认的处理方式
返回值:是之前信号处理方式
	函数指针、SIG_IGN、SIG_DFL、SIG_ERR

屏蔽SIGINT信号

#include <signal.h>
#include <stdio.h>

void handler(int s)
{
	printf("signal is %d\n", s);
}

int main()
{
	sigset_t set;
	
	signal(SIGINT, handler);
	
	//把SIGINT信号准备屏蔽掉
	sigaddset(&set, SIGINT);
	
	while(1);
}

控制台内容:

./a.out 
^Csignal is 2

ctrl+c之后程序并没有退出 而是输出了信号内容。

信号处理

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);
功能:设置或获取信号处理方式

struct sigaction {
 	// 信号处理函数指针
 	void (*sa_handler)(int);
 	// 信号处理函数指针 需要使用sigqueue发送信号
    void (*sa_sigaction)(int, siginfo_t *, void *);
    // 信号屏蔽码
    sigset_t sa_mask;
    int sa_flags;
    	SA_NOCLDSTOP:忽略SIGCHLD信号
    	SA_NODEFER/SA_NOMASK:在处理信号时不屏蔽信号
    	SA_RESETHAND:处理完信号后,恢复系统默认处理方式
    	SA_RESTART:当信号处理函数中断的系统调用,则重启系统调用。
    	SA_SIGINFO:用sa_sigaction处理信号

信号中附加数据:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void sigint(int signum,siginfo_t* info,void* ptr)
{
	printf("收到信号%d,附加数据有:%d %d\n",getpid(),info->si_pid,info->si_int);
}

int main()
{
	printf("%d\n",getpid());
	struct sigaction act = {};
	act.sa_sigaction = sigint;
	act.sa_flags = SA_SIGINFO;

	sigaction(SIGINT,&act,NULL); 
	pause();
}

输出结果:

./a.out 
8323
^C收到信号8323,附加数据有:0 2003799784
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值