哈尔滨理工大学课程设计报告
1.3 设计思想
系统调用fork()创建两个子进程,再调用signal()让父进程捕
捉键
盘上的中断信号(即按Ctrl + C键);当捕捉到中断信号后, Kill()向两个子进程发出信号,子进程捕捉到信号 终止:
Child Process 1 is Killed by Parent! Child Process 2 is Killed by Parent!
父进程调用
后分别输出下列信息后
父进程等待两个子进程终止后,输出如下的信息后终止:
Parent Process is Killed!
1.4 流程图
创建子进程p1NoP1 > 0Yes创建子进程p2No子进程P2等待父进程SIGSUR2消息后输出Child Process 2 is Killed by Parent!子进程P1等待父进程SIGSUR1消息后输出Child Process 1 is Killed by Parent!P2 > 0Yes
父进程等待子进程都结束后输出Parent process is killed! 1.5 主要程序代码
#include\
哈尔滨理工大学课程设计报告
#include\#include\#include\#include\int k = 0; int p1,p2;
// pid_t child1 = 0,child2 = 0;
void func_father (int sig) // 父进程信号处理函数; {
// 传送参数sig指定的信号给参数pid指定的进程;返回值:0:成功;-1:出
错;
// 信号宏名:SIGUSR1,用户定义信号1,信号值:10,默认动作:终止进程; }
void func_p1 (int sig) // 子进程p1信号处理函数; {
k=1;
// 标志相应SIGUSR1消息结束;}
kill (p1, SIGUSR1); kill (p2, SIGUSR2);
void func_p2 (int sig) // 子进程p2信号处理函数; {
k=1;
// 标志相应SIGUSR2消息结束;}
int main () {
while((p1 = fork()) == -1); // fork () = -1创建子进程失败; if (p1 > 0) // 父进程继续创建子进程p2;
哈尔滨理工大学课程设计报告
{
while ((p2 = fork ()) == -1); if (p2 > 0) // 父进程 {
// 设置信号处理方式,依照参数signum指定的信号编号设置处理函数; // 指定信号到达时跳转到参数handler指定的函数执行;
// 返回值:成功:返回先前信号处理函数指针;出错:SIG_ERR(-1); } else { }
signal (SIGINT, func_father); wait (0); // 等待子进程1结束 wait (0); // 等待子进程2结束 printf (\ exit (0);
// 子进程p2
signal (SIGINT, SIG_IGN); // 忽略本应给父进程的按键中断;
signal (SIGUSR2, func_p2); // 接收父进程的消息后转到处理函数; k = 0;
while (k == 0); // 等待子进程2收到父进程的消息后置k=1 printf (\exit(0);
哈尔滨理工大学课程设计报告
}
else // 子进程p1 { } }
return 0;
signal (SIGINT, SIG_IGN); // 忽略本应给父进程的按键中断; signal (SIGUSR1, func_p1); // 接收父进程的消息后转到处理函数; k = 0; while (k == 0);
// 等待子进程1收到父进程的消息后置k=1
printf (\exit(0);
1.6 运行结果及分析
当按下Ctrl + C后,产生消息响应。
1.7 心得体会
哈尔滨理工大学课程设计报告
通过本次实验,掌握了如何创建进程以及进程的软中断。
题目2 进程的管道通信
2.1 题目的主要研究内容及预期达到的目标
实现进程的管道通信。
2.2 题目研究的工作基础或实验条件
(1)硬件环境:Linux平台。 (2)软件环境:标准C语言。
2.3 设计思想
使用系统调用pipe()建立一条管道线;两个子进程P1和P2分管道各写一句话: Message from Child l!
Message from Child 2!
别向