共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。因此,采用共享内存的通信方式效率是非常高的。

模板:

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
	int shmid;
	char *shmaddr_son;shmaddr_father;
	pid_t pid;
	
	if(shmid= shmget(IPC_PRIVATE, 512, IPC_CREAT) == -1)
		{
			exit(1);
		}
		
	pid = fork();
	if(pid == 0)
		{
			sleep(2);
			shmaddr_son = shmat(mid, NULL, 0);
			printf("memory data is %s\n",shmaddr_son);
			exit(0);
			
		}else if(pid > 0)
			{
				shmaddr_father = shmat(shmid, NULL, 0);
				strcpy(shmaddr_father, "hello word!!!");
				shmdt(shmaddr_father);
				wait(NULL);
				exit(0);
				
			}else if(pid < 0)
				{
						perror("fork error!!!");
						exit(1);
				}
	return 0;
	}

几个常用函数介绍:

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

用来开辟/指向一块共享内存的函数.shmget()用来获得共享内存区域的ID,如果不存在指定的共享区域就创建相应的区域。

shmat(int shmid , char *shmaddr , int shmflag );

用来允许本进程访问一块共享内存的函数.

shmid为shmget的返回值

char *shmaddr是共享内存的起始地址,如果shmaddr为0,内核会把共享内存映像到调用进程的地址空间中选定位置;如果shmaddr不为0,内核会把 共享内存映像到shmaddr指定的位置。所以一般把shmaddr设为0。
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1。

shmdt(const void *shmaddr);

删除本进程对这块内存的使用

shmctl( int shmid , int cmd , struct shmid_ds *buf );

int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:
        IPC_STAT        得到共享内存的状态
        IPC_SET         改变共享内存的状态
        IPC_RMID        删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。

Logo

更多推荐