Linux系统编程——进程间通信:int kill()信号中断

复习参考:https://blog.csdn.net/weibo1230123/article/details/81411827
复习:https://blog.csdn.net/tennysonsky/article/details/46010303

查看信号 kill -l
*同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
*异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/wait.h>

void print_signal(sigset_t sset){

	for (int i = 1; i < 32; ++i)
	{
		//判断信号是否存在信号集里面是则返回 1
		if(sigismember(&sset,i)){
			putchar('1');
		}else{
			putchar('0');
		}
	}
	putchar('\n');
}
int main(){

	/*
	*屏蔽信号描述:先创造信号集合,清空集合里面的数,在添加堵塞进程
	*注意:SIGKILL 和 SIGSTOP 不能更改信号的处理方式,因为它们向用户提供了一种使进程终止的可靠方法
	*/
	//信号集合
	sigset_t siggrop,pendgrop;
	//信号初始化
	sigemptyset(&siggrop);
	//可以设置block
	sigaddset(&siggrop,SIGINT);
	
	//设置信号屏蔽信号集合
	sigprocmask(SIG_SETMASK,&siggrop,NULL);//最后参数保存前面block 的状态,恢复现场
	


	while(1){
				//打印pengding信号
				sigpending(&pendgrop);
				print_signal(pendgrop);
				sleep(1);
				//printf("iam \n");
			}
}

图中的2号信号(SIGINT--Ctrl+c)当输入时打印出1sigaction函数的使用

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

/*
一、函数原型:sigaction函数的功能是检查或修改与指定信号相
关联的处理动作(可同时两种操作)


struct sigaction {
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
}
sa_handler此参数和signal()的参数handler相同,代表新的信号处理函数
sa_mask 用来设置在处理该信号时暂时将sa_mask 指定的信号集搁置
sa_flags 用来设置信号处理的其他相关操作,下列的数值可用。 
SA_RESETHAND:当调用信号处理函数时,将信号的处理函数重置为缺省值SIG_DFL
SA_RESTART:如果信号中断了进程的某个系统调用,则系统自动启动该系统调用
SA_NODEFER :一般情况下, 当信号处理函数运行时,内核将阻塞该给定信号。但是如果设置了 SA_NODEFER标记, 那么在该信号处理函数运行时,内核将不会阻塞该信号

*
*/

void myhandler(int a){

	printf("a=%d\n",a);//a是信号处理函数传递信号
	sleep(6);
	printf("over\n");

}
int main(int argc, char const *argv[])
{
	sigset_t block_grp;
	sigemptyset(&block_grp);
	sigaddset(&block_grp,0);


	struct sigaction  myact;

	myact.sa_handler = myhandler;

	//为空则只执行这个信号的函数,若有两个信号
	//则要在处理这个信号函数的时候要屏蔽别的信号然后处理完以后在执行另外一个信号
	myact.sa_mask = block_grp;

	sigaction(SIGINT,&myact,NULL);
	alarm(3);

	while(1){
				//该函数的作用是将被阻塞的信号中停
				//留在待处理状态的一组信号写到参数set指向的信号集中,
				//成功调用返回0,否则返回-1,并设置errno表明错误原因
				/*sigpending(&pendgrop);

				print_signal(pendgrop);*/
				sleep(1);
				//printf("iam \n");
			}

	return 0;
}

在这里插入图片描述
利用sa_mask设置屏蔽其他信号

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

void myhandler(int a){

	printf("a=%d\n",a);//a是信号处理函数传递信号
	sleep(6);
	printf("over\n");

}
int main(int argc, char const *argv[])
{
	sigset_t block_grp;
	sigemptyset(&block_grp);
	sigaddset(&block_grp,14);


	struct sigaction  myact;

	myact.sa_handler = myhandler;

	//为空则只执行这个信号的函数,若有两个信号
	//则要在处理这个信号函数的时候要屏蔽别的信号然后处理完以后在执行另外一个信号
	myact.sa_mask = block_grp;

	sigaction(SIGINT,&myact,NULL);
	alarm(3);

	while(1){
				//该函数的作用是将被阻塞的信号中停
				//留在待处理状态的一组信号写到参数set指向的信号集中,
				//成功调用返回0,否则返回-1,并设置errno表明错误原因
				/*sigpending(&pendgrop);

				print_signal(pendgrop);*/
				sleep(1);
				//printf("iam \n");
			}

	return 0;
}

在这里插入图片描述

对比两个代码不同之处在于	sigaddset(&block_grp,14);是否设置在处理一个信号函数的时候让另外一个信号阻塞
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章