操作系统作业2进程和进程通信

发布 2023-05-19 08:26:28 阅读 6380

实验二进程和进程通信。

实验报告。仅供参考仅供参考!

一)实验目的。

通过使用进程和进程通信方面的系统调用的,加深理解有关进程方面的基本概念。通过实验对进程有进一步的感性认识,掌握系统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 编写程序完成批处...