当前位置:  操作系统/服务器>linux

Linux进程通信(IPC)方式简介

    来源: 互联网  发布时间:2014-10-15

    本文导语:  进程间通信的目的 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。通知事件:...

进程间通信的目的

数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

进程通信方式

linux下进程间通信的几种主要方式:

(1)管道(pipe)和有名管道(FIFO)
(2)信号(signal)
(3)消息队列
(4)共享内存(shared memory)
(5)信号量(semaphore)
(6)套接字(socket)

管道

管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。通常有种限制,一是半双工,只能单向传输;二是只能在父子进程间使用。
有名管道(也叫FIFO,因为管道工作在先入先出的原则下,第一个写入管道的数据也是第一个被读出的数据)。与管道不同,FIFO不是临时的对象,它们是文件系统中真正的实体,可以用mkfifo命令创建。只要有合适的访问权限,进程就可以使用FIFO。FIFO的打开方式和管道稍微不同。一个管道(它的两个file数据结构、VFS I节点和共享数据页)是一次性创建的,而FIFO已经存在,可以由它的用户打开和关闭。Linux必须处理在写进程打开FIFO之前读进程对它的打开,也必须处理在写进程写数据之前读进程对管道的读。除此以外,FIFO几乎和管道的处理完全一样,而且它们使用一样的数据结构和操作。

信号

信号(signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。
信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无需知道该进程的状态。
如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程 。

进程执行信号的方式:
忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP。
捕捉信号,定义信号处理函数,当信号发生时,执行相应的处理函数。
执行缺省操作,Linux对每种信号都规定了默认操作。

消息队列

消息队列:消息队列是消息的链接表,包括Posix消息队列System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这四种操作:
创建或打开消息队列使用的函数是msgget,这里创建的消息队列的数量会受到系统消息队列数量的限制。
添加消息使用的函数是msgsnd函数,它把消息添加到已打开的消息队列末尾。
读取消息使用的函数是msgrcv,它把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消息。
控制消息队列使用的函数是msgctl,它可以完成多项功能。

信号量/信号灯

信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)。其中信号量对应于某一种资源,取一个非负的整型值。信号量值指的是当前可用的该资源的数量,若它等于0则意味着目前没有可用的资源。

P操作:如果有可用的资源(信号量值>0),则占用一个资源(给信号量值减去一,进入临界区代码)。如果没有可用的资源(信号量值等于0),则被阻塞到,直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。
V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程。如果没有进程等待它,则释放一个资源(给信号量值加一)。

共享内存

共享内存(shared memory)可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。

采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

共享内存实现的步骤:
1.创建共享内存,这里用到的函数是shmget,也就是从内存中获得一段共享内存区域。
2.映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中去,这里使用的函数是shmat。
3.使用不带缓冲的I/O读写命令对其进行操作。
4.撤销映射的操作,其函数为shmdt。

套接口

套接口(socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。


    
 
 

您可能感兴趣的文章:

  • linux僵尸(zombie)进程介绍及清除
  • 高手请教!linux怎样通过pid获取进程信息,如:进程名、进程状态等?
  • linux下进程占用内存空间详解
  • linux命令如何实现重启父进程而不会使其子进程退出
  • Linux进程的内核栈和用户栈概念,相互关系及切换过程
  • WEB前端 iis7站长之家
  • linux下进程间通信:共享内存原理及具体用法举例(基于c/c++语言)
  • Linux守护进程 的子进程 终端处理
  • Linux内核进程与应用进程的通信方式有哪些?
  • 在linux,如何用共享内存来实现进程间的通讯?(这些进程没有父子关系)
  • linux下system函数调用shell命令后,怎样让主进程不等子进程返回,接着执行(在线)?
  • linux进程(线程)运行过程中如何获取本进程当前的内存使用状况,统计信息?
  • 如何linux下监控进程及其子进程占用资源?
  • linux下的进程如何访问另外一个进程建立的mutex?
  • linux中用killall命令杀死进程的时候会释放掉该进程所占有的内存吗?
  • linux内核高手进!关于调用__fork()时0号进程的子进程才能与父进程共享PID的困惑
  • 请教:在Linux下怎么样检测一个进程是否是僵尸进程??
  • 请问linux进程的哪些信息保存在内核里?哪些信息又保存在进程空间里?谢谢
  • Linux下请教一个父进程杀死子进程的问题.
  • 怎么查看Linux中所运行的进程,并且知道哪些是停止响应的,用什么命令可以杀掉停止响应的进程?
  • 【求助】linux/Unix下创建子进程,向父进程发送信号,子进程也能收到改信号,此时如何让子进程不收到信号
  • SSL握手通信详解及linux下c/c++ SSL Socket代码举例
  • 想设计几个简单的通信程序,在linux环境下编译通信,怎么实现?
  • linux驱动程序是怎样通过内核和应用程序通信,还有是怎样和硬件通信,跪求求解,谢谢高手留言。
  • 嵌入式linux下线程通信可以用共享文件法吗?
  • linux与Windows socket通信,乱码
  • Linux上SERVER 和vc上CLIENT的通信connect失败!
  • linux如何和hid类设备通信
  • linux进程异步通信,高手请进
  • Linux网络编程(怎样实现两个客户端之间的通信)
  • linux 与windows 间socket通信问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux/centos/redhat下各种压缩解压缩方式详解
  • 怎么使linux启动重原来的图形方式切换到命令行方式?
  • Linux内存文件系统(ramdisk)的三种实现方式
  • Red Hat Linux7.2的GNOME图形方式下如何切换到文本方式?
  • 怎么将linux的图形登陆方式改为文本方式?
  • LINUX文本方式比图形方式有哪些功能限制,是不是服务器的功能都有,
  • linux能不能像xp那样子以幻灯片方式查看图片。我在一个文件夹里面有几张图片,想进行挑选。用幻灯片查看的方式比较方便
  • linux中用什么方式访问设备
  • linux下的内存管理方式
  • Linux下的文件打开标志(打开方式)和文件的访问权限有什么不同?
  • 咨询一下linux 源码的发布方式
  • linux多线程无法进行阻塞方式的读写操作
  • 我在想,在linux命令行方式下如何上网?浏览网页那?
  • 我的Red Hat Linux 7.0 是图形方式登陆,怎样配置成文本登陆模式?
  • 如何远程使用图形方式登录LINUX?
  • 请问在linux系统下如何设置用ADSL方式上网?
  • [Linux Shell编程] sftp 有没有非交互方式的用法
  • linux的KVM如何设置网络连接方式?
  • 请教高手,通过ssh连接suse linux的三种方式是否可以修改?
  • 标准的Linux可管理性方式 SBLIM
  • Linux下device drvier的安装方式??
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3