实验二进程和进程通信。
实验报告。仅供参考仅供参考!
一)实验目的。
通过使用进程和进程通信方面的系统调用的,加深理解有关进程方面的基本概念。通过实验对进程有进一步的感性认识,掌握系统v的ipc机制。
二)实验题目。
1.设计一个程序,创建一个子进程,使父子进程合作,协调地完成某一功能。要求在该程序中还要使用进程的睡眠、进程图象改换、父进程等待子进程终止、信号的设置与传送(包括信号处理程序)、子进程的终止等有关进程的系统调用。
2.利用unix的消息通信机制、共享内存机制(要用信号灯实施进程间的同步和互斥)实现两个进程间的数据通信。具体的通信数据可从一个文件读出,接收方进程可将收到的数据写入一个新文件,以便能判断数据传送的正确性(对文件操不熟悉的同学可不必通过读写文件,只要键盘输入和输出至屏幕进行比较即可)。 蓝字部分对一般同学不作要求)
三)实验报告要求。
要求在实验室当场调试完成,经老师检查通过,登记,实验报告可免做。
对于因特殊情况,不能到实验室上机的同学,可在自己的linux机器上机,但要求写实验报告,包括题目、数据结构的说明,画出程序框图,在源程序中加入注释,说明程序的测试方法和测试结果,以及实验总结或体会。
在实验报告中要有一幅linux系统运行的截图,截图中要注释实验者的姓名或学号。实验报告不要做压缩文件。
为了截图,可以建立以学号为用户名的帐号,或在命令行中输入姓名或学号(会显示出错,没有关系),或在程序加入注释,再对其截图。
至少要完成一道实验题。
一、运行程序。
一)、数据结构说明和程序框图。
1、数据结构说明。
main()函数:子进程的创建都是在main()函数里面;
signalfun(),是信号sigusr1对应的处理函数;
writetofile函数,是对一个文件写如一定的内容的函数;
readfromfile,是从一个文件里面读取内容的函数。
2、程序框图如下:
二)、源程序。
1、父子进程程序。
#include
#include <>
main()
int pid,status = 1;
void func();
signal(sigusr1,func预置信号处理程序,将sigusr1设置为func函数的功能*/
while ((pid=fork( )1);
if (pid父进程 */
printf("it is the parent process.");
printf("parent: will send signal.");
kill(pid,sigusr1发送信号,即发送执行func函数的信息 */
pid = wait(&status父进程等待子进程终止 */
printf("child process %d,status=%d ",pid,status);
else子进程 */
sleep (2等待接受信号 */
printf("it is the child process.");
printf("child:signal is received.");
execvp ("pwd",(char*)0映像改换,显示当前工作区,exevcp不用给出具体路径,(char*)0指向pwd命令 */
printf("execl error.映像改换失败 */
exit(2);
printf ("parent process finish. ");
void func ()
system("date");
2、消息通信机制。
#include <>
#include
#include
#include
#define msgkey 5678
struct msgtype{
long mtype;
int text;
#include ""
main()
请求进程 */
struct msgtype buf;
int qid,pid;
qid=msgget(msgkey,ipc_creat|0666msgkey为约定的消息队列关键字,访问控制权限为0666 */
请求进程发送消息标识为1 */
请求进程发送消息内容为进程标识 */
msgsnd(qid,&buf,sizeof( ipc_nowait|04000); 发送消息正文长度为buf的大小 */
msgrcv(qid,&buf,512,pid,msg_noerror); 指定接收mtype=pid的信息,即请求进程发送给服务器处理后的信息 */
printf("request received a massags from server, type is: %d",#include ""
main()
服务器进程 */
struct msgtype buf;
int qid;
if((qid=msgget(msgkey,ipc_creat|0666))=1)
return(-1出错处理 */
while(1){
msgrcv(qid,&buf,512,1,msg_noerror接收所有请求进程发送的消息 */
printf("server receive a request from process %d",将请求进程的标识数作为mtype的值,以便于请求进程识别 */
msgsnd(qid,&buf,sizeof(int),ipc_nowait|04000将消息发送给请求进程 */
3、共享内存机制。
#include
#include
#include
#include
#include <>
#define shmkey 18001 /*共享内存关键字 */
#define shmkey2 18002
#define size 1024 /*共享内存长度 */
#define semkey1 19001 /*信号灯组1关键字 */
#define semkey2 19002 /*信号灯组2关键字 */
#define semkey3 19003 /*信号灯组3关键字 */
static void semcall(sid,op)
int sid,op;
struct sembuf sb;
= 0; /信号灯编号0 */
= op; /信号灯操作数加1或减1 */
= 0; /操作标志 */
if(semop(sid,&sb,1) =1)
perror("semop");出错处理 */
int creatsem(key) /信号灯组创建及初始化程序 */
key_t key;
int sid;
union semun { 如中已定义,则省略 */
int val;
struct semid_ds *buf;
ushort *array;
arg;if((sid=semget(key,1,0666|ipc_creat))=1) /创建1个关键字为1的信号灯组,访问控制权限为0666 */
perror("semget");出错处理 */
/* 初值为1 */
if(semctl(sid,0,setval,arg)==1) /将信号灯组的第一个信号灯的初值置1 */
perror("semctl");出错处理 */
return(sid);
void p(sid)
int sid;
semcall(sid,-1); 对关键字为sid信号灯组值减1,相当于wait */
void v(sid)
int sid;
semcall(sid,1); 对关键字为sid信号灯组值加1,相当于signal */
main()
char *segaddr,*segaddr2;
int segid,segid2,sid1,sid2,sid3;
if((segid=shmget(shmkey,size,ipc_creat|0666))=1) /创建共享内存段 */
perror("shmget");出错处理 */
if((segid2=shmget(shmkey2,size,ipc_creat|0666))=1) /创建共享内存段2 */
perror("shmget");出错处理 */
segaddr=shmat(segid,0,0); 将共享内存映射到进程数据空间 */
segaddr2=shmat(segid2,0,0); 将共享内存2映射到进程数据空间 */
sid1=creatsem(semkey1); 创建三个信号灯,初值为1 */
sid2=creatsem(semkey2);
sid3=creatsem(semkey3);
p(sid2); 置信号灯2值为0,表示缓冲区1空 */
p(sid3); 置信号灯3值为0,表示缓冲区2空 */
if(!fork())
if(!fork())
while(1){ 子进程的子进程,接收和输出 */
p(sid3);
printf("received from parent: %s",segaddr2);
printf("received from grandparent: %s",segaddr);
操作系统作业 第2章进程管理作业 2
1 进程实体由哪几部分构成,进程的实体是由三部分组成的 程序,数据结构,进程控制块。2 进程控制块的组织方式由哪几种 组织方式有三种 线性方式,链接方式,索引方式。3 什么是原语?原语有什么特点?有哪几种原语?每种原语分别完成进程的那些工作 或状态转换 1原语的概念 把系统态下执行的某些具有特定功能...
操作系统课后习题答案2进程答案
习题。2进程 线程管理。一 选择题。题号。答案。b b d c d c a b d c题号。答案。a a 二 综合题。答 在多道程序环境下,允许多个程序并发执行,这就导致了在操作系统中引入了 进。程 进程是随着操作系统中分时思想的提出而引出的。进程是一个可并发执行的具有。独立功能的程序在某个数据集合...
操作系统课程设计进程调度
批处理系统的作业调度模拟。一 课程设计目的。1 加深对作业概念的了解 2 深入了解批处理系统如何组织作业 管理作业和调度作业 3 巩固相关的理论知识 二 课程设计预备知识。1 作业控制块的概念和结构 2 作业的创建 3 作业的调度算法 4 c语言的相关知识。三 课程设计内容要求。1 编写程序完成批处...