电子发烧友App

硬声App

创作

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示
电子发烧友网>电子资料下载>嵌入式开发>linux操作系统下的进程通信

linux操作系统下的进程通信

2017-10-31 | rar | 0.4 MB | 次下载 | 1积分

资料介绍

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来,如图示:
  其中,最初Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;Posix IPC包括:Posix消息队列、Posix信号灯、Posix共享内存区。有两点需要简单说明一下:
  1)由于Unix版本的多样性,电子电气工程协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算肪车目梢浦残圆僮飨低辰缑妫≒SOIX)。现有大部分Unix和流行版本都是遵循POSIX标准的,而Linux从一开始就遵循POSIX标准;
  2)BSD并不是没有涉足单机内的进程间通信(socket本身就可以用于单机内的进程间通信)。事实上,很多Unix版本的单机IPC留有BSD的痕迹,如4.4BSD支持的匿名内存映射、4.3+BSD对可靠信号语义的实现等等。
  linux下进程间通信的几种主要手段简介:
  1.管道
  管道是进程间通信中最古老的方式,它包括无名管道和有名管道两种,前者可用于具有亲缘关系进程间的通信,即可用于父进程和子进程间的通信,后者额克服了管道没有名字的限制,因此,除具有前者所具有的功能外,它还允许无亲缘关系进程间的通信,即可用于运行于同一台机器上的任意两个进程间的通信。
  无名管道由pipe()函数创建:
  #include 《unistd.h》
  int pipe(int fiLEDis);
  参数filedis返回两个文件描述符:filedes[0]为读而打开,filedes为写而打开。filedes的输出是filedes[0]的输入。
  在Linux系统下,有名管道可由两种方式创建:命令行方式mknod系统调用和函数mkfifo。下面的两种途径都在当前目录下生成了一个名为myfifo的有名管道:
  方式一:mkfifo(“myfifo”,“rw”);
  方式二:mknod myfifo p

  2.消息队列
  消息队列是消息的链接表,包括Posix消息队列system V消息队列。消息队列用于运行于同一台机器上的进程间通信,它和管道很相似,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  我们可以用流管道或者套接口的方式来取代它。
  3.共享内存
  共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写。共享内存往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
  首先要用的函数是shmget,它获得一个共享存储标识符。
  #include 《sys/types.h》
  #include 《sys/ipc.h》
  #include 《sys/shm.h》
  int shmget(key_t key, int size, int flag);
  这个函数有点类似大家熟悉的malloc函数,系统按照请求分配size大小的内存用作共享内存。linux系统内核中每个IPC结构都有的一个非负整数的标识符,这样对一个消息队列发送消息时只要引用标识符就可以了。这个标识符是内核由IPC结构的关键字得到的,这个关键字,就是上面第一个函数的key。数据类型key_t是在头文件sys/types.h中定义的,它是一个长整形的数据。在我们后面的章节中,还会碰到这个关键字。
  当共享内存创建后,其余进程可以调用shmat()将其连接到自身的地址空间中。
  void *shmat(int shmid, void *addr, int flag);
  shmid为shmget函数返回的共享存储标识符,addr和flag参数决定了以什么方式来确定连接的地址,函数的返回值即是该进程数据段所连接的实际地址,进程可以对此进程进行读写操作。
  使用共享存储来实现进程间通信的注意点是对数据存取的同步,必须确保当一个进程去读取数据时,它所想要的数据已经写好了。通常,信号量被要来实现对共享存储数据存取的同步,另外,可以通过使用shmctl函数设置共享存储内存的某些标志位如SHM_LOCK、SHM_UNLOCK等来实现。
  4. 信号量
  信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:
  (1) 测试控制该资源的信号量。
  (2) 若此信号量的值为正,则允许进行使用该资源。进程将进号量减1。
  (3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。
  (4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
  维护信号量状态的是Linux内核操作系统而不是用户进程。我们可以从头文件/usr/src/linux/include/linux/sem.h中看到内核用来维护信号量状态的各个结构的定义。信号量是一个数据集合,用户可以单独使用这一集合的每个元素。要调用的第一个函数是semget,用以获得一个信号量ID。
  #include 《sys/types.h》
  #include 《sys/ipc.h》
  #include 《sys/sem.h》
  int semget(key_t key, int nsems, int flag);
  key是前面讲过的IPC结构的关键字,它将来决定是创建新的信号量集合,还是引用一个现有的信号量集合。nsems是该集合中的信号量数。如果是创建新集合(一般在服务器中),则必须指定nsems;如果是引用一个现有的信号量集合(一般在客户机中)则将nsems指定为0。
  semctl函数用来对信号量进行操作。
  int semctl(int semid, int semnum, int cmd, union semun arg);
  不同的操作是通过cmd参数来实现的,在头文件sem.h中定义了7种不同的操作,实际编程时可以参照使用。
下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1pllua-ng为PostgreSQL数据库嵌入Lua
  2. 0.25 MB  |  6次下载  |  免费
  3. 2家居智慧灯光控制系统
  4. 3.05 MB  |  6次下载  |  免费
  5. 3智慧禽畜养殖系统方案
  6. 7.03 MB  |  6次下载  |  免费
  7. 4机房动力环境监控系统优势
  8. 3.25 MB  |  5次下载  |  免费
  9. 5Labview串口传输
  10. 0.06 MB  |  4次下载  |  免费
  11. 6机房一体式动环监控系统
  12. 3.82 MB  |  3次下载  |  免费
  13. 7蓝牙网关VDB2602数据手册
  14. 2.41 MB  |  3次下载  |  免费
  15. 8NI Multisim入门教程
  16. 9.00 MB  |  2次下载  |  免费

本月

  1. 1基于STM32水温控制
  2. 18.81 MB  |  31次下载  |  免费
  3. 2STM32F103中文教程及参考手册
  4. 3.69 MB  |  31次下载  |  免费
  5. 3常见电子元器件完整版
  6. 26.28 MB  |  30次下载  |  免费
  7. 4功率放大电路资料
  8. 0.41 MB  |  28次下载  |  免费
  9. 5开关电源设计的考虑因素
  10. 1.58 MB  |  28次下载  |  免费
  11. 6电路分析基础(第二版)课件
  12. 15.61 MB  |  26次下载  |  免费
  13. 7Altium Designer21.9.2软件安装包下载
  14. 0.01 MB  |  25次下载  |  免费
  15. 8Multisim 14.3专业版软件下载
  16. 5.65 MB  |  21次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  934939次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537596次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 1331200  |  419932次下载  |  免费
  7. 4OrCAD10.5下载,OrCAD10.5中文版软件
  8. 817182  |  233963次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  232924次下载  |  免费
  11. 6数据采集系统基础知识视频
  12. 16.3 MB  |  192989次下载  |  免费
  13. 7电路仿真软件multisim 10.0免费下载
  14. 340992  |  190999次下载  |  免费
  15. 8十天学会AVR单片机与C语言视频教程 下载
  16. 158M  |  183134次下载  |  免费
版权所有 © 深圳华秋电子有限公司 电子发烧友电路图粤公网安备 44030402000349号 电信与信息服务业务经营许可证:粤B2-20160233 工商网监认证工商网监 粤ICP备14022951号