- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统课程实验报告
实验题目:
Linux进程信号通信、进程消息通信
专 业 软件工程
学 生 姓 名
班 级 学 号
教 师 陈兴国
指 导 单 位 计算机学院
日 期 2016-9-30
教师评语
教师签名:
年 月 日
成绩评定
备 注
一、实验目的
1.了解Linux的信号,熟悉Linux系统中进程之间软中断通信的基本原理
2.学习如何利用消息缓冲队列进行进程间的通信,并加深对消息通信机制的理解。
二、实验指导
1.kill(),signal(),lockf()系统调用
kill()系统调用
系统调用格式:int kill(pid,sig)
参数定义: int pid,sid;
pid是一个或一组进程的标识符,sig是要发送的软中断信号。
pid0时,核心将信号发送给进程pid;
pid=0时,核心将信号发送给与发送进程同组的所有进程;
pid0时,核心将信号发送给搜有用户标识符真正等于发送进程的有效用户标识号的进程。
signal()系统调用
预置对信号的处理方式,允许调用进程控制软中断信号。
系统调用格式:
signal (sig,function)
参数定义:
Signal (sig,function)
int sig;
void (*func)();
sig用于指定信号的类型,sig为0则没有收到任何信号。
function:在该进程中的一个函数地址,在核心态返回用户态时,它以软中断信号的序号作为参数调用该函数,对除了信号SIGNAL,SIGTRAP和SIGPWR以外的信号,核心自动地重新设置软中断信号处理程序的值为SIG_DFL,一个进程不能捕获SIGKILL信号。
lockf()系统调用
用作锁定文件的某些段或者整个文件。
系统调用格式:lockf(files,function,size)
参数定义:
int lockf(files,function,size)
int files,function;
long size;
2.消息的创建,发送和接收
使用系统调用msgget(),msgsnd,msgrec,及msgctl()函数编写消息的发送和接收程序
三、实验过程描述与结果分析
1.Linux进程信号通信
#include stdio.h
#include signal.h
#includeunistd.h
#include stdlib.h
void waiting(),stop();
int wait_mark;/*用来避免锁的竞争,保证p1,p2无法在同一时刻获得文件的锁,即lockf(stdout,1,0)*/
main()
{
int p1,p2,stdout;
signal(SIGINT,stop);/*if press the ^c or ^break ,jump to stop function*/
while((p1=fork())==-1) ;/* create child process p1*/
if(p10)
{
while( ( p2=fork() ) ==-1);/* create child process p2*/
if(p20)
{
wait_mark=1;
sleep(5);/* 接收到^c信号,转stop函数*/
waiting();
kill(p1,16); /*向子进程p1发送软中断信号16*/
kill(p2,17);/*向子进程p2发送软中断信号17*/
wait(0);/*wait()系统方法,父进程会一直等待,直到子进程因暂停或者终止发来软中断信号为止*/
wait(0);
printf(Parent process is killed!\n);
exit(0);
}
else{//p2被杀死的逻辑, 响应kill(p1,17);
wait_mark=1;
signal(17,stop);/*接收到父进程发来的软中断信号,然后执行stop函数*、 */
waiting();
lockf(stdout,1,0);/*锁定输出,使得下面的语句可以正常输出打印*/
printf(Child process 2 is killed by pare
文档评论(0)