实验三2_Linux进程间通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 的时候没有任何的连接,删除将是立即的。