现在的位置: 首页 > 综合 > 正文

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

2014年10月23日 ⁄ 综合 ⁄ 共 3020字 ⁄ 字号 评论关闭

一.共享内存:

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

 

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

 

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

 

二.共享内存的实现:

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

(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);

                                                       }

}

 

抱歉!评论已关闭.