共享内存-父子进程、非亲缘关系进程通信

共享内存的特点:
共享内存创建后一直存在于内核中,直到被删除或系统关闭;
共享内存和管道不一样,读取后,内容仍然存在。

shm_get函数: 共享内存的创建
头文件: #include <sys/types.h>
     #include <sys/ipc.h>
     #include <sys/shm.h>
函数原型: int shmget(key_t key, int size, int shmflg)
函数参数: key:IPC_PRIVATE 或 ftok的返回值
      size:共享内存区大小
      shmflg:同open函数的权限位,也可以用8进制表示
返回: 成功:共享内存段标识符,ID,文件描述符
    失败:-1
查看IPC对象:ipcs -m 共享内存/ -p 消息队列/ -s 信号灯
删除IPC对象:ipcrm -m/-p/-s id
例:shmid=shmget(IPC_PRIVATE,128,0777);

使用shmget函数创建共享内存时,参数如果是IPC_PRIVATE,则共享内存的key值都一样,为0。如果要使key非0,则需要借助函数ftok。
ftok函数:
原型: char ftok(const char *path, char key)
参数: path:文件路径和文件名
    key:一个字符
返回值:成功返回一个key值
    失败-1
例:key=ftok("./a.c",‘b’);
  shmid=shmget(key,128,IPC_CREAT | 0777);

shmat函数: 创建了共享内存后需要将内存映射到用户空间,减少内核访问。
原型:void *shmat(int shmid, const void *shmaddr, int shmflg) //类似于malloc
参数: 第一个参数,ID号
    第二个参数,映射到的地址,NULL为系统自动完成的映射
    第三个参数,shmflg, SHM_RDONLY共享内存只读
          默认是0,表示可读写
返回: 成功映射后的地址
   失败NULL
例:p=(char *)shmat(shmid,NULL,0);

shmdt函数: 删除进程中的地址映射
原型: int shmdt(const void *shmaddr)
参数: shmaddr共享内存映射后的地址
返回: 成功0,出错-1
例:shmdt(p );

shmctl函数: 删除共享内存对象
原型: int shmctl(int shmid, int cmd, struct shmid_ds * buf)
参数: shmid,要操作的共享内存标识符
    cmd: IPC_STAT,获取对象属性值 //实现了命令ipcs -m
        IPC_SET,设置对象属性
        IPC_RMID,删除对象 //实现了命令ipcrm -m
    buf: 指定IPC_STAT/IPC_SET时用以保存/设置属性
返回: 成功0,出错-1
例:shmctl(shmid,IPC_RMID,NULL);

父子进程通信
  父进程完成内存映射后,等待读取用户输入信息;当输入完成后,通过kill向子进程发送SIGUSR1信号告知有消息可读,同时父进程进入睡眠状态;
   子进程完成内存映射后,就进入休眠状态;当收到信号后,进程唤醒,并从共享内存中读取信息;读取完成后向父进程发送SIGUSR2信号,告知,信息被读取,你可以继续输入了。

#include "sys/shm.h"
#include "signal.h"
#include "unistd.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void myfun(int signum)
{
   
   
  return ;
}
int main()
{
   
   
  int shmid;
  int key;
  char *p;
  int pid;
  shmid=shmget(IPC_PRIVATE,128,IPC_CREAT | 0777);
  if(shmid <0)
  {
   
   
	printf("creat share memory failure\n");
	return -1;
  }
  printf("creat share memory sucess shmid=%d\n",shmid);
 
  pid=fork();
  if(pid > 0)//parent process 
  {
   
    
	signal(SIGUSR2,myfun);//kill默认终止进程,需加处理函数
    p=(char *)shmat(shmid,NULL,0);
    if
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值