进程控制理论<三>---那些年我们一起学习linux程序设计

一.共享内存:

共享内存:是被多个进程共享的一部分物理内存。

 

共享内存是进程间共享数据的一种最快的方式;

 

一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立即看到其中的内容。

 

二.共享内存的实现:

共享内存的实现分为两个步骤

(1) 创建共享内存,使用shmget函数。

(2) 映射共享内存,将这段创建的共享映射到具体的进程空间去,使用shmat函数

A.创建:

int shmget(key_t  key , int size ,int shmflg)

(shmget:获取共享内存)

key标识共享内存的键值:/   IPC_PRIVATE.

key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中又设置IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。

返回值:如果成功,返回共享内存标识符;如果失败,返回-1

B、映射

int  shmat(int shmid ,char *shmaddr ,int flag)

shmat:连接共享内存)

参数:

(1) shmid :shmget函数返回的个共享存储标识符;

(2) shmaddr :一般为0;(表示有系统帮你找一个地址)

(3) flag :决定以什么方式来确定映射的地址(通常为0

 

返回值:如果成功,则返回共享内存映射到的进程的地址;

         如果失败,则返回-1

 

当一个进程不再需要共享内存时,需要把它从进程地址空间中脱离。

      Int   shmdt (char *shmaddr)

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <unistd.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

 

#define PERM S_IRUSR|S_IWUSR

/* 共享内存 */

int main(int argc,char **argv)

{

                                                int shmid;

                                     char *p_addr,*c_addr;

                                                      

                                               if(argc!=2)

                                                       {

                                                        fprintf(stderr,"Usage:%s\n\a",argv[0]);

                                                        exit(1);

                                                       }

 

                                      /* 创建共享内存 */

            if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)

                                                       {

                                                        fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno));

                                                        exit(1);

                                                       }

 

                                        /* 创建子进程 */

                                      if(fork()) // 父进程写

                                                       {

                                                        p_addr=shmat(shmid,0,0); /*把创建好的内存映射到父进程当中来,shmid:父进程的编号,第二个参数为0,即让系统自动帮找一个地址*/

                                                        /*shmat()返回值:如果成功,则返回共享内存映射到的进程的地址;

         如果失败,则返回-1*/

                                                        memset(p_addr,'\0',1024); /*让内存区全部为结束符*/

                                                        strncpy(p_addr,argv[1],1024);

                                                        wait(NULL); // 释放资源,不关心终止状态(等待子进程退出)

                                                        exit(0);

                                                       }

                                   else       // 子进程读

                                                       {

                                                        sleep(1); // 暂停1         

                                                        c_addr=shmat(shmid,0,0);

                                                        printf("Client get %s\n",c_addr);

                                                        exit(0);

                                                       }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值