在linux中,可以使用IPC对象来进行进程间通信。IPC对象存在于内核中,多进程可以操作同一个IPC对象。每个IPC对象都有一个唯一的编号,该编号是由系统分配的。那么不同的进程如何知道这个编号,进而通过它进行通信呢?下面以共享内存为例,进行分析。

方法一:通过ftok函数,产生相同的键值。

假设,进程p1创建了共享内存。可以在创建时,调用ftok函数,得到一个key值,调用shmget函数,该函数会返回所创建共享内存的编号,并将key和编号关联起来。若进程p2想利用这个共享内存和p1进程通信,也可以调用ftok函数,得到同样的key,再根据key值,调用shmget函数,就可以获得该共享内存的编号。该过程可以通过下面的图来表达。

ftok函数原型如下:
                #include < sys/types.h>
                #include < sys/ipc.h>
                key_t ftok(const char *pathname, int proj_id);

第一个参数pathname,是一个存在的文件或目录名;

第二个参数proj_id,是非0整数(一般用i节点号)

该函数会返回一个key值,先运行的进程根据key来创建对象,后运行的进程根据key来打开对象。示意图如下:

使用 ftok创建共享内存,毫无关系的进程,可以通过得到同样的key,来操作同一个共享内存,对共享内存进行读写时,需要利用信号量进行同步或互斥。

方法二:使用IPC_PRIVATE对象

使用IPC_PRIVATE创建的IPC对象, key值属性为0,和IPC对象的编号就没有了对应关系。这样毫无关系的进程,就不能通过key值来得到IPC对象的编号(因为这种方式创建的IPC对象的key值都是0)。因此,这种方式产生的IPC对象,和无名管道类似,不能用于毫无关系的进程间通信。但也不是一点用处都没有,仍然可以用于有亲缘关系的进程间通信。示例程序如下:

#include < stdio.h>
#include < stdlib.h>
#include < errno.h>
#include < sys/ipc.h>
#include < sys/types.h>
#include < sys/shm.h>
#include < string.h>
#define MAXSIZE 1024int main(){int shmid;char *p = NULL;pid_t pid;key_t key;if ((key = ftok(".", 'a')) == -1){perror("ftok");exit(-1);}if ((shmid = shmget(IPC_PRIVATE, MAXSIZE, 0666)) == -1){perror("shmget");exit(-1);}if ((pid = fork()) == -1){perror("fork");exit(-1);}if (pid == 0){if ((p = shmat(shmid, NULL, 0)) == (void *)-1){perror("shmat");exit(-1);}strcpy(p, "hello\n");system("ipcs -m");if (shmdt(p) == -1){perror("shmdt");exit(-1);}system("ipcs -m");}else{getchar();if((p = shmat(shmid, NULL, 0)) == (void *)-1){perror("shmat");exit(-1);}printf("%s\n", (char *)p);if (shmctl(shmid, IPC_RMID, NULL) == -1){perror("RM");exit(-1);}}return 0;
}

该程序中,父进程使用IPC_PRIVATE方式创建了共享内存,然后fork产生了子进程,由于子进程是复制父进程的方式产生的,因此,子进程也可以操作共享内存。子进程往共享内存里写了内容后,父进程可以读到。

转自https://blog.csdn.net/niepangu/article/details/55271708

Linux进程通信中IPC对象——IPC_PRIVATE与ftok相关推荐

  1. linux进程管道通信缺点,Linux进程通信(IPC)的方式详解

    前言:Linux进程通信的方式 什么是进程通信?进程通信是指进程之间交换信息 进程通信方式共有6种: 管道(pipe),包括流管道(s_pipe)和有名管道(named pipe) 信号(signal ...

  2. linux进程通信中有名管道的特点,linux进程通信之(四):有名管道的读与写

    前面我们说了无名管道,下面我们来说说有名管道,请看下面一段代码: fifo_write.c: #include#include#include#include#include#include#incl ...

  3. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  4. linux进程通信发送方式,Linux服务器编程——Linux系统编程之进程通信

    进程通信又称IPC IPC方法 方法:管道(最简单) 信号(开销最小) 共享映射区/共享内存(无血缘关系) 本地套接字(最稳定) Linux文件类型: -   文件 d  目录 l   符号链接 s  ...

  5. Linux进程通信——匿名管道、命名管道、管道的特性和共享内存

    Linux进程通信--匿名管道.命名管道.管道的特性和共享内存 一.管道 1.1 什么是管道? 1.2 匿名管道 <1> 匿名管道参数说明 <2> fork共享管道原理 < ...

  6. Linux进程通信和线程通信

    1.进程和线程是什么 简单的描述:进程好比是工厂,线程是工厂里的生产线,一个进程里面可以包含多个线程.  专业术语:进程是cpu资源分配的最小单位,线程是cpu调度的最小单位. 每个进程都有独立的代码 ...

  7. 【操作系统实验】Linux进程通信—共享内存通信、管道通信

    Linux进程通信-共享内存通信.管道通信 一.实验目的: 二.实验题目: 1. 试设计程序利用共享内存完成如下进程通信 1.shmget函数 2.shmat函数 3.shmdt函数 4.shmctl ...

  8. Linux进程通信的试验

    1.实验目的 1.1了解Linux进程通信的概念. 1.2 掌握Linux进程通信的常用方法. 2.实验内容 创建admin用户,密码也是admin. 用admin登陆后,创建src目录,所有的源代码 ...

  9. linux一个进程通知另外一个进程,Linux进程通信学习笔记

    一.为什么需要进程通信 1)数据传输 一个进程需要把它的数据发送给另一个进程. 2)资源共享 多个进程之间共享同样的资源. 3)通知事件 一个进程向另外一个进程发送消息,通知它发生了某事件. 4)进程 ...

最新文章

  1. 剑指offer:矩形覆盖 python 实现
  2. SpringMVC和Dubbo的整合
  3. linux kill命令使用
  4. tp5获取所有请求参数、请求头和IP(亲测)
  5. Servlet_生命周期方法
  6. 内核中引发bug并打印信息
  7. 关于浮动float属性和position:absolute属性的区别
  8. Wizard of Orz CodeForces - 1467A
  9. matplotlib设置画布大小_PyTorch 49.matplotlib模块
  10. SSM之检验用户名是否重复
  11. Go 切片使用绕坑指南
  12. LabView中,下拉列表和枚举有什么区别?
  13. 合成未来宝宝照片_当英国皇室宝宝长大:阿奇王子变卷毛星人,夏洛特公主颜值最能抗...
  14. ARMLinux 下驱动开发第三节
  15. 蓝桥杯 ADV-169 算法提高 士兵排队问题
  16. Delphi系列书籍118本
  17. LNBP10L_LNB电源和控制电压调节器——科时进商城
  18. Python基于WordCloud词云图的数据可视化分析 词云图的基本使用 政府工作报告分析
  19. JSP对接国际验证码接口DEMO示例
  20. 关于下载JDK需要注册账号

热门文章

  1. 摄像头定位:ICCV2019论文解析
  2. Android系统的启动过程
  3. Laravel 7发行说明
  4. Java 异步与同步的区别
  5. php laravel 环境搭建
  6. [UWP]实现一个轻量级的应用内消息通知控件
  7. n2n windows 编译安装文件
  8. BZOJ3572: [Hnoi2014]世界树
  9. kafka消息会不会丢失
  10. 小程序中点击input控件键盘弹出时placeholder文字上移