linux操作系统课程设计报告书_第1页
linux操作系统课程设计报告书_第2页
linux操作系统课程设计报告书_第3页
linux操作系统课程设计报告书_第4页
linux操作系统课程设计报告书_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目1 进程软中断通信11 题目的主要研究内容及预期达到的目标实现进程的软中断通信:父进程发信号控制子程序的终止。12 题目研究的工作基础或实验条件(1)硬件环境:linux平台。(2)软件环境:标准c语言。13 设计思想系统调用fork()创建两个子进程,再调用signal()让父进程捕捉键盘上的中断信号(即按ctrl + c键);当捕捉到中断信号后,父进程调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: child process 1 is killed by parent! child process 2 is killed by parent! 父进程等

2、待两个子进程终止后,输出如下的信息后终止: parent process is killed!14 流程图15 主要程序代码#includestdio.h#includeunistd.h#includesignal.h#includesys/types.h#includestdlib.hint k = 0;int p1,p2;/ pid_t child1 = 0,child2 = 0;void func_father (int sig) / 父进程信号处理函数; / 传送参数sig指定的信号给参数pid指定的进程;返回值:0:成功;-1:出错; / 信号宏名:sigusr1,用户定义信号1,信

3、号值:10,默认动作:终止进程; kill (p1, sigusr1); kill (p2, sigusr2);void func_p1 (int sig) / 子进程p1信号处理函数;k=1;/ 标志相应sigusr1消息结束;void func_p2 (int sig) / 子进程p2信号处理函数;k=1;/ 标志相应sigusr2消息结束;int main () while(p1 = fork() = -1); / fork () = -1创建子进程失败; if (p1 0) / 父进程继续创建子进程p2; while (p2 = fork () = -1); if (p2 0) / 父

4、进程 / 设置信号处理方式,依照参数signum指定的信号编号设置处理函数; / 指定信号到达时跳转到参数handler指定的函数执行; / 返回值:成功:返回先前信号处理函数指针;出错:sig_err(-1); signal (sigint, func_father); wait (0);/ 等待子进程1结束 wait (0);/ 等待子进程2结束 printf (parent process is killed!n); exit (0); else/ 子进程p2 signal (sigint, sig_ign);/ 忽略本应给父进程的按键中断; signal (sigusr2, func_

5、p2); / 接收父进程的消息后转到处理函数; k = 0; while (k = 0);/ 等待子进程2收到父进程的消息后置k=1 printf (child process 2 is killed by parent!n); exit(0); else/ 子进程p1 signal (sigint, sig_ign); / 忽略本应给父进程的按键中断; signal (sigusr1, func_p1); / 接收父进程的消息后转到处理函数; k = 0; while (k = 0);/ 等待子进程1收到父进程的消息后置k=1 printf (child process 1 is kille

6、d by parent!n); exit(0); return 0;16 运行结果及分析当按下ctrl + c后,产生消息响应。17 心得体会通过本次实验,掌握了如何创建进程以及进程的软中断。题目2 进程的管道通信21 题目的主要研究内容及预期达到的目标实现进程的管道通信。22 题目研究的工作基础或实验条件(1)硬件环境:linux平台。(2)软件环境:标准c语言。23 设计思想使用系统调用pipe()建立一条管道线;两个子进程p1和p2分别向管道各写一句话: message from child l! message from child 2! 父进程从管道中读出来自于两个子进程的信息,显示

7、在屏幕上。 要求父进程先接收子进程p1的消息,再接收子进程p2的消息。24 流程图25 主要程序代码#include #include #include int pid1,pid2;/ pid_t pid1,pid2; main( ) int fd2; / 打开文件的文件描述符数组fd0读,fd1写; char outpipe100,inpipe100; pipe (fd); / 先创建管道,再创建子进程 while (pid1 = fork( ) = -1); / fork () = -1创建子进程失败 if (pid1 = 0) / child1 lockf (fd1,1, 0); / 建

8、立互斥文件锁 sprintf (outpipe,message from child l !); / 把串放入数组outpipe中 write (fd1, outpipe, 50); / 把outpipe所指内存写入50个字节到fd1的文件; sleep (5); /*自我阻塞5秒*/ lockf (fd1,0,0); / 解除互斥文件锁 exit (0); else / pid1 0 while (pid2 = fork ( ) = -1); if (pid2 = 0) / child2 lockf (fd1,1, 0); /*互斥*/ sprintf (outpipe,message fr

9、om child 2 !); write (fd1, outpipe, 50); sleep (5); lockf (fd1, 0, 0); exit (0); else / pid1 0 & pid2 0,父进程 wait (0); /*同步*/ read (fd0, inpipe, 50); /*从管道中读长为50字节的串*/ printf (%sn, inpipe); wait (0); read (fd0, inpipe, 50); printf (%sn, inpipe); exit (0); 16 运行结果及分析父进程先接收子进程1的消息再接受子进程2的消息,并打印。17 心得体会

10、通过本次实验,掌握了如何创建管道以及利用管道方式进程间通信。题目3 进程间通信设计31 题目的主要研究内容及预期达到的目标利用消息队列实现进程间的通信。32 题目研究的工作基础或实验条件(1)硬件环境:linux平台。(2)软件环境:标准c语言。33 设计思想使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为512b的消息的发送和接收程序。34 流程图35 主要程序代码发送方主要代码:int main (int argc, char *argv) int msqid ; struct msgbuf buf ; int flag ; / 发送消息返回值

11、0:成功; int key ; / 创建ipc通讯ftok出的键值; int sendlength ; / 发送消息的大小,不含消息类型long占用的4个字节; key = ftok (msg.tmp, 0x01 ) ; / 返回系统建立ipc通讯时需要的id值; if ( key 0 ) perror (ftok key error) ; return -1 ; msqid = msgget ( key, 0600 | ipc_creat ) ; / 创建队列对象并返回标识符; if ( msqid 0 ) perror (create message queue error) ; retu

12、rn -1 ; buf.mtype = 1 ; strcpy (buf.mtext, this is a test of inter-progress connumation which made by shi zhongyu who majors in computing science and technology, information science and engineering school, shen yang university of technology. ) ; sendlength = sizeof (struct msgbuf) - sizeof (long) ;

13、flag = msgsnd ( msqid, &buf, sendlength , 0 ) ; / 将消息写入到消息列队; if ( flag 0 ) perror (send message error) ; return -1 ; system (ipcs -q) ;/ 创建子进程执行命令:显示消息队列; return 0 ;接收方主要代码:int main (int argc, char *argv) int msqid ; struct msqid_ds info ; struct msgbuf buf1 ; int flag ; int recvlength ; int key ;

14、int mtype ; key = ftok (msg.tmp, 0x01 ) ; / 返回系统建立ipc通讯时需要的id值; if ( key 0 ) perror (ftok key error) ; return -1 ; msqid = msgget ( key, 0 ) ; / 返回队列标识符; if ( msqid 0 :接收类型等于发送消息类型的第一个消息; / 从标识符msqid的队列读取消息存于msgp,再删除队列中消息; flag = msgrcv ( msqid, &buf1, recvlength ,mtype, 0 ) ; if ( flag 0 ) perror (

15、recv message errorn) ; return -1 ; printf ( message :%sn, buf1.mtext) ; system (ipcs -q) ; / 创建子进程执行命令:显示消息队列; return 0 ;36 运行结果及分析先发送消息到已存在的文件msg.tmp,读取消息后自动删除消息。再利用ipcrm -q 294912(msqid)删除该消息队列。37 心得体会通过本次实验,掌握了如何创建消息队列进行进程间通信。题目4 利用多进程实现生产者消费者问题41 题目的主要研究内容及预期达到的目标利用多进程实现生产者消费者问题。42 题目研究的工作基础或实验条

16、件(1)硬件环境:linux平台。(2)软件环境:标准c语言。43 设计思想创建两个子进程;一个子进程(生产者进程)依次向缓冲区写入整数0,1,2,.,9;另一个子进程(消费者进程)暂停5s后,从缓冲区读数,每次读一个,并将读出的数字从缓冲区删除,然后将数字显示出来;父进程等待子进程2(消费者进程)的退出信息,待收集到该信息后,父进程就返回。44 流程图35 主要程序代码int main(void) int i = 0;int *ncount; int fd2; / 打开文件描述符数组fd0读fd1写; char szbuff11 = 0;int status; pipe(pfd); / 先创

17、建管道,再创建子进程 while (pid1 = fork ( ) = -1); / fork () = -1创建子进程失败; if (pid1 = 0)/ child1,生产者进程 ncount = (int *) (malloc (sizeof (int) * 10); / 分配40个字节的内存块; for (i = 0; i 0 while (pid2 = fork ( ) = -1); if (pid2 = 0)/ child2,消费者进程 sleep (5); read (fd0, szbuff, 10); / 把fd0的文件传送到szbuff指向的内存中; printf (%sn,

18、 szbuff); close (fd0);close (fd1); else / pid1 0 & pid2 0,父进程 pid1 = wait (&status);/ wait(0); /*同步*/ i = wexitstatus (status); printf (child1 is %d ,exit status =%dn, pid1, i); pid2 = wait (&status); i = wexitstatus (status); printf(child2 is %d ,exit status =%dn, pid2, i); close (fd0);close (fd1); return 0; 46 运行结果及分析生产者进程依次想缓冲区写入09,消费者进程暂停5秒后从缓冲区读数,读一个删一个。然后将数字显示出来,并打印子进程号。47 心得体会通过本次实验,掌握了如何创建消息队列进行模拟生产者消费者问题。总结 通过本次操作系统课程设计,掌握了linux平台下的相关进程通信的知识。以下是自己通过查阅相关文献整理的linux系统编程的部分学习笔记。进程间通信类型有:管道、信号、消息队列等。进程间通信的目的:数据传输、共享数据、通知事件、资源共享、进程控制。管道是将两个file结构指向同一临时vfs索引节点,vfs索引节点指向同一物理页

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论