这篇博文记录我完成操作系统实验之进程软中断的过程。

实验要求

编制实现进程软中断通信的程序。
使用系统调用fork()创建两个子进程,
再用系统调用signal()让父进程捕捉键盘上发出的3号quit中断信号,
当父进程接收到3号中断后,
父进程用系统调用kill()向两个子进程分别发出整数值为16和17软中断信号,
子进程获得对应软中断信号,然后分别输出下列信息后终止:

1
2
Child process 1 is killed by parent !!   
Child process 2 is killed by parent !!

父进程调用wait()函数等待两个子进程终止后,输出以下信息,结束进程:
1
Parent process is killed!!

程序流程图

进程软中断的程序流程图
注:为了便于实验,即使5s内没有输入quit信号,也不产生SIGALRM来kill子进程,而是显示5s内无中断信号继而直接退出。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <wait.h>
int wait_flag;
void stop();
int main()
{
int pid1, pid2;
while ((pid1 = fork()) == -1);
if (pid1 > 0)
{
while ((pid2 = fork()) == -1);
if (pid2 > 0)
{
wait_flag = 1;
signal(3, stop);
sleep(5);
if (!wait_flag)
{
kill(pid1, 16);
kill(pid2, 17);
wait(0);
wait(0);
printf("Parent process is killed !!\r\n");
}
else printf("No signal in 5s");
exit(0);
}
else
{
wait_flag = 1;
signal(17, stop);
signal(3,SIG_IGN);
while(wait_flag!=0);
lockf(1,1,0);
printf("Child process 2 is killed by parent !!\r\n");
lockf(1,0,0);
exit(0);
}
}
else
{
wait_flag = 1;
signal(16, stop);
signal(3,SIG_IGN);
while(wait_flag!=0);
lockf(1,1,0);
printf("Child process 1 is killed by parent !!\r\n");
lockf(1,0,0);
exit(0);
}
return 0;
}
void stop()
{
wait_flag = 0;
}

运行结果

运行结果
符合预期!

拓展创新

为了更好地理解进程软中断通信的原理,尝试探索其他中断信号。
将3号quit信号换成2号del信号,且在子进程接受到16或17号中断时,不直接结束,而是调用startalarm设置alarm(3),在3秒后生成14号闹钟信号来结束子进程,实现了子进程的延时结束,父进程等待子进程结束后退出。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <wait.h>
int wait_flag;
void stop();
void startalarm();
int main()
{
int pid1, pid2;
while ((pid1 = fork()) == -1);
if (pid1 > 0)
{
while ((pid2 = fork()) == -1);
if (pid2 > 0)
{
wait_flag = 1;
signal(2, stop);
sleep(15);
if (!wait_flag)
{
kill(pid1, 16);
kill(pid2, 17);
wait(0);
wait(0);
printf("Parent process is killed !!\r\n");
}
else printf("No signal in 15s!");
exit(0);
}
else
{
wait_flag = 1;
signal(17, startalarm);
signal(14, stop);
signal(2,SIG_IGN);
while(wait_flag!=0);
lockf(1,1,0);
printf("Child process 2 is killed by parent !!\r\n");
lockf(1,0,0);
exit(0);
}
}
else
{
wait_flag = 1;
signal(16, startalarm);
signal(14, stop);
signal(2,SIG_IGN);
while(wait_flag!=0);
lockf(1,1,0);
printf("Child process 1 is killed by parent !!\r\n");
lockf(1,0,0);
exit(0);
}
return 0;
}
void stop()
{
wait_flag = 0;
}

void startalarm()
{
alarm(3);
}

运行结果

运行结果
符合预期!

end