南邮操作系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间: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是要发送的软中断信号。
pid>0时,核心将信号发送给进程pid;
pid=0时,核心将信号发送给与发送进程同组的所有进程;
pid<0时,核心将信号发送给搜有用户标识符真正等于发送进程的有效用户标识号的进程。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
#include
#include
#include
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(p1>0)
{
while( ( p2=fork() ) ==-1);/* create child process p2*/
if(p2>0)
{
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 parent!\n");
lockf(stdout,0,0);/*解锁输出*/
exit(0);/*正常终止子进程p2,使得父进程跳出wait(0),得以继续执行*/ }
}
else{//p1被杀死的逻辑,响应kill(p2,16);
wait_mark=1;
signal(16,stop);
waiting();
lockf(stdout,1,0);
printf("Child process 1 is killed by parent!\n");
lockf(stdout,0,0);
exit(0);
}
}
void waiting(){
while(wait_mark!=0);
}
void stop(){
wait_mark=0;
}
按住Ctrl+c,可见执行结果
2.Linux进程消息通信
1.server.c
#include
#include
#include
#include
#define MSGKEY 75
struct msgform{
long mtype;
char mtext[256];
};
int main(int argc, char const *argv[]) {
struct msgform msg;
int msgqid;