实验三2_Linux进程间通信

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三2_Linux进程间通信

实验三 Linux进程间通信

一、实验目的

熟悉Linux下进程间通信机制,能够使用系统提供的各种通信机制实现并发进程间的数据交换。

二、实验题目

分别使用Linux下的共享存储区、消息、管道等通信机制,编程实现并发进程之间的相互通信。

三、背景材料

(一)需要用到的系统调用

实验可能需要用到的主要系统调用和库函数在下面列出,详细的使用方法说明通过“man 2 系统调用名”或者“man 3 函数名”命令获取。

fork() 创建一个子进程,通过返回值区分是在父进程还是子进程中执行;

wait() 等待子进程执行完成;

getpid() 获取当前进程id;

shmget() 建立一个共享存储区;

shmctl() 操纵一个共享存储区;

shmat() 把一个共享存储区附接到进程内存空间;

shmdt() 把一个已经附接的共享存储区从进程内存空间断开;

msgget() 建立一个消息队列;

msgctl() 操纵一个消息队列;

msgsnd() 发送消息;

msgrcv() 接收消息;

signal() 设置对信号的处理方式或处理过程;

pipe() 打开管道;

lockf() 锁定一个文件。

(二)使用共享存储区的示例程序

下面程序主要用来演示共享存储区的使用方法:首先要使用shmget得到共享存储区句柄(可以新建或连接已有的共享存储区,以关键字标识),然后使用shmat挂接到进程的存储空间(这样才能够访问),当使用完后,使用shmctl释放(shmctl 还可以完成一些其他功能)。这种使用逻辑也适用于消息和信号量。示例程序代码如下:

#include

#include

#include

#include

#include

int main(void)

{

int x, shmid;

int *shmptr;

if((shmid=shmget(IPC_PRIVATE, sizeof(int), IPC_CREAT|0666)) < 0) printf("shmget error"), exit(1);

//函数原型int shmget(key_t key,int size,int shmflg); 函数用于创建(或者获取)一

key键值指定的共享内存对象,返回该对象的系统标识符:shmid;size 是创个由

IPC_CREAT|0666,说明新建一个权限为0666的消息队列,建的共享内存的大小,

id,若其中组用户、当前用户以及其他用户拥有读写的权限若成功则返回共享内存

-1 出错则为

if((shmptr=(int *)shmat(shmid, 0, 0)) == (int *)-1)

printf("shmat error"), exit(1);

// void *shmat(int shm_id,void *shm_addr,int shmflg); shm_id标识码,shm_addr连

,shmflg标志位接到的地址

printf("Input a initial value for *shmptr: ");

scanf("%d", shmptr);

while((x=fork())==-1);

if(x==0) /* child run */

{

printf("When child runs, *shmptr=%d\n", *shmptr);

printf("Input a value in child: ");

scanf("%d", shmptr);

printf("*shmptr=%d\n", *shmptr);

}

else /* parent run */

{

wait();

printf("After child runs, in parent, *shmptr=%d\n", *shmptr);

if ( shmctl(shmid, IPC_RMID, 0) < 0 )

// shmctl()函数声明:int shmctl(int shmqid, int cmd, struct shmid_ds *buf);

返回值:0 on success

函数用于对已创建的共享内存对象进行查询、设值、删除等操作;这个函数-1 on error:

和 msgget()函数十分相似,用法也相同。它支持的操作有:

shm_id所指向内存共享段的shmid_ds IPC_STAT 获得共享内存的信息,

结构,对参数buf指向的结构。

使用buf指向的结构对sh_mid段的相关结 IPC_SET 设定共享内存的信息, 构赋值,只对以下几个域有作用,shm_perm.

uid shm_perm.gid以及shm_perm.mode

注意此命令只有具备以下条件的进程才可以请求:

1(进程的用户ID等于shm_perm.cuid或者

等于shm_perm.uid

2(超级用户特权进程。

删除shm_id所指向的共享内存段,只有当 IPC_RMID 删除共享内存,

shmid_ds结构的shm_nattch域为零时,才

会真正执行删除命令,否则不会删除该段注意此命令的请求规则与IPC_SET命令相同。

需要说明的是,当执行 IPC_RMID 操作时,系统并不是立即将其删除,而只是将其标为待删,然后等待与其连接的进程断开连接。只有当所有的连接都断开以后系统才执行真正的删除操

作。当然,如果执行 IPC_RMID 的时候没有任何的连接,删除将是立即的。

相关文档
最新文档