操作系统原理与Linux系统结课实验报告

更新时间:2023-08-30 08:49:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

(实验六 进程间通信)

操作系统原理与Linux系统结课实验报告

学 院:信息科学与工程学院

班 级:网络11-1班

姓 名:* * *

学 号:****

2014年5月20号

实验题目: 进程间通信

学号: ******** 姓名: ***

main() { int i,j; signal (17,func); if (i=fork() ) { printf("Parent: Signal 17 will be send to Child!! \n"); kill (i,17); wait(0); printf("Parent: finished!! \n"); } else { sleep(10); printf("Child:A signal from my parent is received!! \n"); exit(0); }

} func() { printf(It is signal 17 processing function!! \n); }

程序二:

//进程管道通信 #include <stdio.h> #include <signal.h> #include <unistd.h>

main() {

int x,fd[2]; char s[30]; pipe(fd); for(;;){ x=fork(); if (x==0) { sprintf(s,"Hello-world!!!\n"); write(fd[1],s,20); sleep(3); exit(0); } else { wait(0); read(fd[0],s,20); printf("&&***********&&\n"); } }

}

程序三:

//消息队列通信 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>

#include <errno.h> #include <stropts.h> #include <time.h> #include <strings.h> #include <string.h> #include <stdio.h> #include <sys/ipc.h> #include <sys/msg.h>

struct msg { long msg_types; char msg_buf[511]; }; int main(void){ int qid; int pid; int len; struct msg pmsg; pmsg.msg_types = getpid(); sprintf (pmsg.msg_buf,"hello!this is :%d\n\0", getpid() ); len = strlen (pmsg.msg_buf); if ( (qid= msgget (IPC_PRIVATE, IPC_CREAT | 0666)) < 0 ){ perror( "msgget" ); exit(1); } if ( (msgsnd(qid, &pmsg, len, 0)) <0){ perror( "msgsn" ); exit(1); }

printf ("Successfully send a message to the queue: %d \n",qid); exit(0); }

四、运行结果

下图为实验桌面,gcc 编译过程中生成的文件。Gcc 编译过程(命令步骤) : 1) 、ls 2) 、cd 桌面 3) 、gcc -c test.c 4) 、gcc -c test.c -o mytest.o 5) 、./mytest.o 第 3 步为只编译.c 文

件,第 4 步对程序进行连接生成可执行的.o 文件并为 之改名,第 5 步就是执行.o 文件得出结果。

1、进程中断通信 进程软中断通信实验结果显示: 先输出打印 Parent: Signal 17 will be send to Child!! It is signal 17 processing function!! 睡眠 10 秒钟后,再输出打印 Child:A signal from my parent is received!! It is signal 17 processing function!! Parent: finished!!

2、进程管道通信 进程管道通信实验结果显示: 实验结果是每隔 3 秒钟,无限循环的输出打印一次字符串 “&&***********&&” 。

3、消息队列通信 消息队列通信实验结果显示: 第一次执行 mytest2.o 文件得出的实验结果是 Successfully send a message to the queue:0 ; 第二次执行 mytest2.o 文件得出的实验结果是 Successfully send a message to the queue:32769 ; 以后每次执行 mytest2.o 文件得出数值都是在上一次的的基础上+32769, 如: 第三次执行 mytest2.o 文件得出的实验结果是 Successfully send a message to the queue:65538 。

五、结论 1、软中断通信提供了一个简单的处理异步事件的方法,用户进程可以向自 己发送信号以中断程序的执行, 并自动转入指定的软中断处理函数中去执行用户 自行安排的处理内容,处理完毕后再返回用户进程继续执行; 实验中,指定的型号类型为 17 号即为用户自定义信号 2 类型,用 fork() 创建子进程,再用系统调用 signal()让父进程捕捉键盘的中断信号,之后, 父进程用系统调用 kill () 向子进程发出信号, 子进程捕捉到信号后输出 A signal from my parent is received! 2、管道是一种遵循先进先出原则的数据结构,也就是说,先进入管道的数 据,也能先从管道中读出,数据一旦读取后,就会自动删除。管道通信,以管道 数据结构作为内部数据存储方式,以文件系统作为数据存储媒体,将一个写进程 与一个读进程连接在一起,实现两个进程间的通信;

实验中,用 pipe(fd)来创建管道,用 x=fork()来创建子进程,然后将字符 串 写 到 子 进 程 中 write(fd[1],s,20) , 而 父 进 程 中 则 是 在 管 道 中 读 取 信 息 read(fd[0],s,20),打印输出“&&***********&&”。 3、消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法, 每个数据块都被认为含有一个类型, 接收进程可以独立地接收含有不同类型的数 据结构。 我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队 列与命名管道一样,每个数据块都有一个最大长度的限制; 实验中创建了一个消息结构体 struct msg{},这消息结构体的消息类型为 当前进程的 ID,然后,创建一个消息队列 if ( (qid= msgget (IPC_PRIVATE, IPC_CREAT | 0666)) < 0 ){ perror( "msgget" ); exit(1); } 接着,往消息

队列中发送消息 if ( (msgsnd(qid, &pmsg, len, 0)) <0){ perror( "msgsn" ); exit(1); } 最后,打印输出!

本文来源:https://www.bwwdw.com/article/r5vi.html

Top