操作系统第6次实验报告:使用信号
一、实验目的
通过编程进一步了解信号。
二、实验内容
在服务器上用Vim编写程序,完成以下两个作业:
作业1:发送SIGTERM结束子进程
-
int kill(pid_t pid, int sig);
。通过kill函数向包括它本身在内的其他进程发送一个信号要求:
-
在主进程中创建一个子进程
-
子进程中死循环输出“Hello World”字符串
-
主进程睡眠5s后,向子进程发送终止信号(SIGTERM)结束子进程
作业2:发送ALARM、PAUSE
-
unsigned int alarm(unsigned int seconds);
调用alarm函数在经过预定时间后发送一个SIGALRM信号 -
pause()
stop until signal要求:
-
将进程挂起,5秒后发送一个SIGALRM信号,继续运行。
1. 运行结果
-
作业1
是否编译通过?编译已通过并成功生成名为sbr的可执行文件
是否运行结果正确?(逻辑也要正确)可以看到在子进程在5秒内输出五句Hello World后结束
-
作业2
是否编译通过?编译已通过并成功生成名为sbrr的可执行文件
是否运行结果正确?(逻辑也要正确)可以看到我们睡了10秒,在进行到第五秒的时候发送了alarm信号激活了闹钟,闹钟函数结束 后继续睡觉直至第10秒
2. 源代码
作业1
#include<stdio.h>
#include<signal.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main() {
pid_t pid=fork();//创建子进程
if(pid==0){//进入子进程状态
while(1){
printf("Hello World\n");//输出
sleep(1);//适量降低输出次数
}
}
if(pid>0){//进入父进程状态
sleep(5);//进入5秒的睡眠,以便子进程的输出
kill(pid,SIGINT);//实现kill函数,通过SIGINT终止子进程
printf("子进程已结束!");
}
return 0;
}
作业2
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <stdbool.h>
void ala(){
printf("叮叮叮~闹钟响啦!\n");//发送信号时执行的动作
}
int main(){
(void) signal(SIGALRM,ala);//更改SIGALRM信号的默认动作
alarm(5);//设置闹钟的时常
for(int i=0;i<10;i++){
printf("我正在睡觉(~ o ~)-zZ.......\n");
sleep(1);//适量降低输出次数,同时提示睡眠状态
}
return 0;
}
3.总结
学习了系统内置信号的使用,同时也加深巩固了子进程和父进程的创建和使用。