Linux进程间通信(2)实验报告_第1页
Linux进程间通信(2)实验报告_第2页
Linux进程间通信(2)实验报告_第3页
Linux进程间通信(2)实验报告_第4页
Linux进程间通信(2)实验报告_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、精选文档试验六:Linux进程间通信(2)(4课时)试验目的:理解进程通信原理;把握进程中信号量、共享内存、消息队列相关的函数的使用。试验原理:Linux下进程通信相关函数除上次试验所用的几个还有:信号量 信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。要调用的第一个函数是semget,用以获得一个信号量ID。 int semget(key_t key, int nsems, int flag); key是IPC结构的关键字,flag将来打算是创建新的信号量集合,还是引用一个现有的信号量集合。nsems是该集合中的信号量数。假如是创建新

2、 集合(一般在服务器中),则必需指定nsems;假如是引用一个现有的信号量集合(一般在客户机中)则将nsems指定为0。 semctl函数用来对信号量进行操作。 int semctl(int semid, int semnum, int cmd, union semun arg); 不同的操作是通过cmd参数来实现的,在头文件sem.h中定义了7种不同的操作,实际编程时可以参照使用。 semop函数自动执行信号量集合上的操作数组。 int semop(int semid, struct sembuf semoparray, size_t nops); semoparray是一个指针,它指向一个

3、信号量操作数组。nops规定该数组中操作的数量。ftok原型如下:key_t ftok( char * fname, int id )fname就是指定的文件名(该文件必需是存在而且可以访问的),id是子序号,虽然为int,但是只有8个比特被使用(0-255)。当成功执行的时候,一个key_t值将会被返回,否则 -1 被返回。共享内存共享内存是运行在同一台机器上的进程间通信最快的方式,由于数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写。首先要用的函数是shmget,它获得一个共享存储标识符。 #include <sys/types.

4、h> #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int flag); 当共享内存创建后,其余进程可以调用shmat()将其连接到自身的地址空间中。 void *shmat(int shmid, void *addr, int flag); shmid为shmget函数返回的共享存储标识符,addr和flag参数打算了以什么方式来确定连接的地址,函数的返回值即是该进程数据段所连接的实际地址,进程可以对此

5、进程进行读写操作。 断开共享内存连接:与shmat函数相反,shmdt是用来断开与共享内存附加点的地址,禁止本进程访问此片共享内存函数原型int shmdt(const void *shmaddr)函数传入值shmaddr:连接的共享内存的起始地址函数返回值成功:0出错:-1,错误缘由存于error中附加说明本函数调用并不删除所指定的共享内存区,而只是将从前用shmat函数连接(attach)好的共享内存脱离(detach)目前的进程错误代码EINVAL:无效的参数shmaddr。消息队列消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。1.创建新消

6、息队列或取得已存在消息队列原型:int msgget(key_t key, int msgflg);参数:     key:键值,可以指定,也可以由函数ftok生成。     msgflg:IPC_CREAT值,若没有该队列,则创建一个并返回新标识符;若已存在,则返回原标识符。             IPC_EXCL值,若没有该队列,则返回-1;若已存在,则返回0。2.向队列读/写消息原型:msgrcv从队列中取用消息:ssize_t msgrcv(in

7、t msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);msgsnd将数据放到消息队列中:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);参数:     msqid:消息队列的标识码     msgp:指向消息缓冲区的指针,此位置用来临时存储发送和接收的消息     msgsz:消息的大小。     msgtyp:从消息队列内读取

8、的消息形态。假如值为零,则表示消息队列中的全部消息都会被读取。msgflg:用来指明核心程序在队列没有数据的状况下所应实行的行动。3.设置消息队列属性原型:int msgctl ( int msgqid, int cmd, struct msqid_ds *buf );参数:msgctl 系统调用对 msgqid 标识的消息队列执行 cmd 操作,系统定义了 3 种 cmd 操作: IPC_STAT , IPC_SET , IPC_RMID      IPC_STAT : 该命令用来猎取消息队列对应的 msqid_ds 数据结构,并将

9、其保存到 buf 指定的地址空间。      IPC_SET : 该命令用来设置消息队列的属性,要设置的属性存储在buf中。           IPC_RMID : 从内核中删除 msqid 标识的消息队列。试验内容:1、 完成教材上信号量实例,想一下ftok函数的作用?修改例子,创建2个进程完成原来父子进程对应的操作。子进程代码:#include<sys/types.h>#include<unistd.h>#include<stdio.h>#include<s

10、tdlib.h>#include<sys/types.h>#include<sys/sem.h>#include<sys/ipc.h>#define DELAY_TIME 3union semun int val;struct semid_ds *buf;unsigned short *array;int init_sem(int sem_id,int init_value)union semun sem_union;sem_union.val = init_value;if(semctl(sem_id,0, SETVAL,sem_union)=-1)

11、perror("Initialize semaphore");return -1;return 0;int del_sem(int sem_id)union semun sem_union;if(semctl(sem_id,0,IPC_RMID,sem_union)=-1)perror("Delete semaphore");return -1;int sem_p(int sem_id)struct sembuf sem_b;sem_b.sem_num =0 ;sem_b.sem_op =-1;sem_b.sem_flg=SEM_UNDO;if(semo

12、p(sem_id,&sem_b,1)=-1)perror("P operation");return -1;return 0;int sem_v(int sem_id)struct sembuf sem_b;sem_b.sem_num =0 ;sem_b.sem_op =1;sem_b.sem_flg=SEM_UNDO;if(semop(sem_id,&sem_b,1)=-1)perror("V operation");return -1;return 0;int main()pid_t result;int sem_id;sem_id

13、=semget(ftok(".",'a'),1,0666|IPC_CREAT);init_sem(sem_id,0);printf("Child process will wait for some seconds.n");sleep(DELAY_TIME);printf("The returned valud is %d in the child process(PID = %d)n",result,getpid();sem_v(sem_id);等待进程:#include<sys/types.h>#inc

14、lude<unistd.h>#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/sem.h>#include<sys/ipc.h>#define DELAY_TIME 3union semunint val;struct semid_ds *buf;unsigned short *array;int init_sem(int sem_id,int init_value)union semun sem_union;sem_union.val

15、 = init_value;if(semctl(sem_id,0, SETVAL,sem_union)=-1)perror("Initialize semaphore");return -1;return 0;int del_sem(int sem_id)union semun sem_union;if(semctl(sem_id,0,IPC_RMID,sem_union)=-1)perror("Delete semaphore");return -1;int sem_p(int sem_id)struct sembuf sem_b;sem_b.sem_

16、num =0 ;sem_b.sem_op =-1;sem_b.sem_flg=SEM_UNDO;if(semop(sem_id,&sem_b,1)=-1)perror("P operation");return -1;return 0;int sem_v(int sem_id)struct sembuf sem_b;sem_b.sem_num =0 ;sem_b.sem_op =1;sem_b.sem_flg=SEM_UNDO;if(semop(sem_id,&sem_b,1)=-1)perror("V operation");retur

17、n -1;return 0;int main()pid_t result;int sem_id;sem_id =semget(ftok(".",'a'),1,0666|IPC_CREAT);init_sem(sem_id,0);sem_p(sem_id);printf("The returned value is %d in the father process (PID =%d)n",result,getpid();sem_v(sem_id);del_sem(sem_id);2、 完成教材上共享内存实例,查看运行状况。然后修改ftok函

18、数的参数,并编写两个进程完成实例原来的工作。代码:#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define BUFFER_SIZE 2048int main()pid_t pid;int shmid;char *shm_addr;char flag= "WROTE"char buffBUFFER_SIZE;if(

19、shmid = shmget(IPC_PRIVATE,BUFFER_SIZE,0666)<0)perror("shmget");exit(1);elseprintf("Create shared-memory: %d n",shmid);system("ipcs -m");pid = fork();if(pid=-1)perror("fork");exit(1);else if(pid = 0)if(shm_addr = shmat(shmid,0,0)=(void*)-1)perror("Chil

20、d: shmat");exit(1);elseprintf("Child:Attach shared-memory: %pn",shm_addr);system("ipcs -m");while(strncmp(shm_addr,flag,strlen(flag)printf("Child: Wait for enable data . n");sleep(5);strcpy(buff,shm_addr+strlen(flag);printf("Chil: Shared-memory:%sn",buff);if(shmdt(shm_addr)<0)perror("shmdt");exit(1);elseprintf("Child: Deattach shared-memoryn");system("ipcs -m");if(shmctl(shmid,IPC_

温馨提示

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

评论

0/150

提交评论