这篇博文记录我完成操作系统实验之进程软中断的过程。
实验要求
编制实现进程软中断通信的程序。
使用系统调用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