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

x33g5p2x  于2021-12-26 转载在 Linux  
字(1.8k)|赞(0)|评价(0)|浏览(569)

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
……

相关文章