计算机操作系统第三次实验 信号通信
供大家交流学习,最好自己动手做,这样才有最深切的体会。 1.实验目的了解并掌握利用信号通信机制在父子进程间进行通信。 2.实验软硬件环境安装Windows XP的计算机VirtualBox软件,以及在其上安装的Ubuntu虚拟机 3.实验内容 在Linux下利用信号通信机制在父子进程间进行通信。由子进程发送事件信号,父进程获取事件信号后...
·
供大家交流学习,最好自己动手做,这样才有最深切的体会。
1.实验目的
了解并掌握利用信号通信机制在父子进程间进行通信。
2.实验软硬件环境
- 安装Windows XP的计算机
- VirtualBox软件,以及在其上安装的Ubuntu虚拟机
3.实验内容
在Linux下利用信号通信机制在父子进程间进行通信。由子进程发送事件信号,父进程获取事件信号后进行相应的处理,将结果输出到终端。
使用函数:
- void (*signal(int signum, void(* handler)(int)))(int) 设置某一信号的对应动作。 第一个参数 signum指明了所要处理的信号,64种。它可以取除了SIGKILL和SIGSTOP外的任何一种信号。 第二个参数 handler描述了与信号关联的动作(处理的方式) 第二个参数可以取以下三种值 (1)一个无返回值的函数地址 捕获 此函数必须在signal()被调用前声明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。 执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行handler中的函数。当函数执行结束后,控制权返回进程被中断的那一点继续执行。 (2)SIG_IGN 忽略 这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。SIGKILL,SIGSTOP不能被忽略,也不能被处理。 (3)SIG_DFL 默认 这个符号表示恢复系统对信号的默认处理。
- int kill (pid_t pid, int sig) 用于向进程发送信号
4.实验程序及分析
实验程序:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<wait.h>
void process()
{
puts("\n\tin process recived a signal");
printf("\tpid here is %d\n",getpid());
puts("\tprocess end\n");
//输出运行process函数的进程pid,即接收信号的进程
}
int main()
{
signal(SIGUSR2,process);
//设置信号种类为SIGUSR2,接收到该信号的进程要运行process函数
int pid;
pid = fork();
//创建子进程
if(pid == 0)
{
puts("\nin child");
puts("deliver a signal to parent ...");
kill(getppid(),SIGUSR2);
//发送信号到父进程
printf("my pid is %d\nparent's pid is %d\n",getpid(),getppid());
puts("child end\n");
}
else if(pid>0)
{
waitpid(pid,NULL,0);
//等待子进程
puts("\nin parent");
printf("my pid is %d\n",getpid());
puts("parent end\n");
}
else
{
puts("failed to create a child process\n");
}
return 0;
}
终端结果:
分析:
线程共享进程的地址空间,所以线程对资源的改变会反映到进程中,故i之前为3,进入线程后被改为2,在进程中输出为2.并且线程自己返回的tid与pthread_create()函数返回到l的值是一样的。
5.实验截图
6.实验心得体会
此次实验signal()函数利用信号实现了父进程和子进程之间的通信,参照书上相关内容,成功地在Linux下完成了该次实验,让我对信号通信机制有了更深的了解。
更多推荐
已为社区贡献6条内容
所有评论(0)