Linux信号学习2 (raise、abort、信号集操作函数)

其他定时函数

raise函数

raise函数:int raise(int sig)
功能:给当前进程发送指定信号(自己给自己发信号),raise(signo)相当于kill(getpid(),signo)
返回值:成功返回0;失败返回非0
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>

int main(int argc,char* argv[]){

	sleep(5);
	printf("等待5s后自杀\n");
	raise(SIGKILL);
	
	while(1);

	return 0;
}

结果:
haitu@ubuntu:/opt/linux_test/signal/signal1$ ./arise 
等待5s后自杀
已杀死

abort函数

abort函数:void abort(void)
功能:给自己发送异常终止信号6:SIGABRT信号,并终止产生core文件
返回值:无
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>

int main(int argc,char* argv[]){

	sleep(5);
	printf("等待5s后自杀\n");
	abort();
	
	while(1);

	return 0;
}

结果:
haitu@ubuntu:/opt/linux_test/signal/signal1$ ./abort 
等待5s后自杀
已放弃 (核心已转储)

信号集操作函数

sigset_t set;//自定义函数集
sigemptyset(sigset_t *set);//清空信号集
sigfillset(sigset_t *set);//全部置一
sigaddset(sigset_t *set, int signum);//将一个信号添加到信号集中
sigdelset(sigset_t *set,int signum);//将一个信号从集合中移除
sigismember(sigset_t *set, int signum);//判断一个信号是否在集合中
int sigprocmask(int how,const sigset_t *set,sigset_t *oldset);//设置信号屏蔽字和解除信号屏蔽字
how: 
	SIG_BLOCK: 设置阻塞
	SIG_UNBLOCK: 取消阻塞
	SIG_SETMASK: 用自定义 set 替换 mask。
set: 自定义 set
oldset:传出参数,旧有的 mask。
int sigpending(sigset_t *set)//传出未决信号集
    set: 传出参数(未决信号集)

信号操作集test测试

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <sys/mman.h>
#include <errno.h>
#include <signal.h>//信号头文件

//该函数用于未决信号集的打印,传入未决信号的sigpending函数的传出参数
void print_set(sigset_t *set)
{
	int i = 0;
	for(;i<32;i++){
		if(sigismember(set,i)){//查看信号在不在创建的信号集中,在返回1,不在返回0
			printf("1");//在打印1字符
		}else{
			printf("0");//不在打印0字符
		}
	}
	printf("\n");//添加换行符号
}

void sys_error(const char* string1){
	perror(string1);
	exit(1);
}

int main(int argc,char* argv[]){

	sigset_t set;//创建的信号集
	sigset_t oldset;//用于传出参数,旧的mask
	sigset_t pdset;//用于未决信号集的传出,只读的。

	sigemptyset(&set);//清空信号集
	sigaddset(&set, SIGINT);//添加各种信号
	sigaddset(&set, SIGQUIT);
	sigaddset(&set, SIGBUS);
	sigaddset(&set, SIGKILL);

	//设置信号屏蔽字
	int ret = sigprocmask(SIG_BLOCK,&set,&oldset);//将自我创建的信号集进行阻塞。
	if(ret == -1){
		sys_error("sigprocmask error");
	}
	
    int ret1 = 0; //用于判断sigpending函数是否执行成功
    
	while(1){
		ret1 = sigpending(&pdset);//传出未决信号集pdset
        
        if(ret1 == -1){
            sys_error("sigpending error");
        }
		print_set(&pdset);//打印未决信号集
		sleep(1);
	}

	return 0;
}

测试结果

haitu@ubuntu:/opt/linux_test/signal/signal2$ ./sigset 
10000000000000000000000000000000
10000000000000000000000000000000
10000000000000000000000000000000
10000000000000000000000000000000
^C10100000000000000000000000000000    //输入ctrl + c
10100000000000000000000000000000
10100000000000000000000000000000
10100000000000000000000000000000
    
//想要关掉的话,可以使用另一个窗口,使用 ps ajx 来查看该进程的pid
//使用命令kill -9 pid号 进行关闭该进程。(SIGKILL信号是不能够屏蔽的,也不能够忽略捕捉)

信号操作集函数的使用原理

#使用kill -l命令可以获取到信号的列表
haitu@ubuntu:/opt/linux_test/signal/signal2$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

#***注意:其中 9 号和 19 号信号比较特殊,只能执行默认动作,不能忽略捕捉,不能设置阻塞。***
sigprocmask:
	通过自定义的信号集set,用来和PCB中的mask信号屏蔽字进行位与、位或、取反位与等操作,用来改变mask信号屏-蔽字的位图状态。就可以实现阻塞、未阻塞等操作,当使用该种信号的时候,那么就会阻塞,那么未决信号集对应的位图位置也就会被置为1。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值