Linux编程基础期末冲刺——第七章信号

1.信号的产生是一个异步事件,从信号产生到信号递达进程需要一定时间,而在这个过程中,会因为各种原因使信号处于不同的状态。Linux系统中信号可能发生的状态有:

发送状态 阻塞状态 未决状态 递达状态 处理状态
见课本154和博客转信号
/

/

kill()函数的参数pid有4种取值,每种取值代表不同的含义。若pid<-1,则表示

见课本p156和博客转信号

、、

、、、
5.在进程的PCB中,存在两个信号集,一个称为,另一个称为。这两个信号集的实质都是位图,其中的每一位对应一个信号。

见课本p161 162 和博客转信号

在这里插入图片描述

signal()函数用于捕捉信号,用于发送信号的函数为kill()。
在这里插入图片描述

在这里插入图片描述

、、

、、
在这里插入图片描述

课本p154
9号信号SIGKILL和19号信号SIGSTOP不能被捕获和屏蔽和忽略。比较特殊

在这里插入图片描述

课本p155 信号表 和博客也有——信号
比较特殊的键盘发送信号的是
见课本p154
在这里插入图片描述
在这里插入图片描述
alarm⏲计时结束默认发送14号信号SGALRM ,默认函数结束进程

简答:

简单说明Linux系统中信号的处理方式。

信号递达进程后才可能被处理,信号的处理方式有三种:忽略、捕捉和执行默认动作。大多数信号都可以被忽略,但9号信号SIGKILL和19号信号SIGSTOP是超级用户杀死进程的可靠方法,不能被忽略,也不能被捕获。

/
/
kill()函数的参数有两个,分别为pid和sig,其中pid表示接收信号的进程的pid。
简单说明该参数的取值,以及每种取值所代表的含义。

参数pid的取值可分为4种情况,每种取值代表的含义如下:
①pid > 0,则发送信号sig给进程号为pid的进程;
②pid = 0,则发送信号sig给当前进程所属组中的所有进程;
③pid = -1,则发送信号sig给除1号进程与当前进程的所有进程;
④pid < -1,则发送信号sig给属于进程组pid的所有进程。

编程:
编写程序,在程序中创建-一个子进程,并通过信号实现父子进程交替计数功能。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
int n = 0, flag = 0;
void sys_err(char *str)
{
	perror(str);
	exit(1);
}
void do_sig_child(int num)
{
	printf("I am child  %d\t%d\n", getpid(), n);
	n += 2;
	flag = 1;
	sleep(1);
}
void do_sig_parent(int num)
{
	printf("I am parent %d\t%d\n", getpid(), n);
	n += 2;
	flag = 1;
	sleep(1);
}
int main(void)
{
	pid_t pid;
	struct sigaction act;
	if ((pid = fork()) < 0)
		sys_err("fork");
	else if (pid > 0) 
	{
		n = 1;
		sleep(1);
		act.sa_handler = do_sig_parent;
		sigemptyset(&act.sa_mask);
		act.sa_flags = 0;
		//注册自己的信号捕捉函数,父使用SIGUSR2信号
		sigaction(SIGUSR2, &act, NULL);
		do_sig_parent(0);
		while (1) {
			/* wait for signal */;
			if (flag == 1) {          //父进程数数完成
				kill(pid, SIGUSR1);
				flag = 0;             //标志已经给子进程发送完信号
			}
		}
	}
	else if (pid == 0) 
	{
		n = 2;
		act.sa_handler = do_sig_child;
		sigemptyset(&act.sa_mask);
		act.sa_flags = 0;
		sigaction(SIGUSR1, &act, NULL);
		while (1) 
		{
			//等待信号
			if (flag == 1) 
			{
				kill(getppid(), SIGUSR2);
				flag = 0;
			}
		}
	}
	return 0;
}

编译程序并执行,程序的执行结果如下:
I am parent 6101	1
I am child  6102	2
I am parent 6101	3
I am child  6102	4
I am parent 6101	5
I am child  6102	6
……

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值