Linux下进程间通信方式

原创 2015年11月19日 15:26:41

1.普通管道,是一种半双工,数据只能从一个方向流向另一个方向,只能用在亲缘进程之间,发送进程将数据送入管道,接受进程从管道中读取数据。使用int pipe(int filedis[2]);函数创建一个普通管道,当一个管道被创建的时候,也创建了两个文件描述符,fieldis[0]是读管道 ,fieldis[1]是写管道。通常是先创建一个管道,然后通过fork函数创建子进程。必须在系统调用fork()前调用pipe(),否则子进程将不会继承文件描述符。否则,会创建两个管道,因为父子进程共享同一段代码段,都会各自调用pipe(),即建立两个管道,出现异常错误。

int pipe_fd[2];

pipe(pipe_fd);  创建一个管道

write(pipe_fd[1],"Hello",5) 向写管道中写入数据。

read(pipe_fd[0],buf_r,100) 从读管道中读出数据。

关闭管道,只需要关闭这两个文件描述符就可以了。close(pipe_fd[0]);  close(pipe_fd[1]);

 

2.命名管道,和普通管道一样也是一种半双工,数据只能从一个方向流向另一个方向,只不过命令管道不仅仅可以使用在亲缘进程之间,不相关的进程也可以使用命名管道进行通信。

命名管道创建mkfifo("zieckey_fifo",0777);

写管道打开 fd=open("zieckey_fifo",O_WRONLY); //阻塞写,open阻塞,除非遇到读

往管道中写入数据 write(fd,s,sizeof(s));

读管道打开fd=open("zieckey_fifo",O_RDONLY); //阻塞读 open阻塞,除非遇到写

从管道中读取数据read(fd,buf,sizeof(buf));

从命名管道的创建和打开,我们可以看出命名管道好像就是一个文件,其实,命名管道就是一种特殊类型的文件,在

文件系统中以文件名的形式存在。

打开方式最常见的是阻塞读+阻塞写 非阻塞读+阻塞写

3.消息队列,消息队列提供了从一个进程向另一个进程发送数据块的方法,消息队列和命名管道很相似。

消息队列是一个进程向消息队列中发送消息,使用msgsnd函数,另一个进程使用msgrcv函数从消息队列中接受消息。

消息队列的优势在于,消息队列独立于进程存在,避免了同步命名管道的打开和关闭带来的困难。

同时消息队列可以避免同步和阻塞问题,不需要进程来提供同步方法。

另外接受进程可以通过消息类型有选择的接受消息,不像命名管道那样只能默认接受。

4.共享内存 共享内存就是允许两个不相关的进程访问同一逻辑内存,共享内存是一种在两个正在运行的进程间

共享和传递数据的一种非常有效的方式。两个不同的进程可以将同一段共享内存连接到各自的字节地址空间,就像是

这段共享内存是分配给他们的一样,一个进程修改共享内存中的数据,其他进程立刻就会收到影响。

特别注意一点,共享内存没有任何阻塞同步机制,也就是一个进程正在修改一个数据,并不会阻塞其他进程读取这个

数据,所以共享内存需要另外提供阻塞同步机制,例如信号量。

5.信号量 信号量是一个特殊的变量,我们通常通过信号来解决多个进程对同一资源的访问竞争的问题,使在任一时刻只能有一个执行线程访问代码的临界区域,也可以说它是协调进程间的对同一资源的访问权,也就是用于同步进程的。

例如两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

6.套接字更为一般的进程间通信机制,可用于不同机器之间的进程间通信


版权声明:本文为博主原创文章,未经博主允许不得转载。

linux下的几种进程间通信方式的特点

linux上面的IPC大多都是从UNIX上面继承而来。         最初Unix IPC包括:管道、FIFO、信号。System V IPC包括:System V消息队列、System V信...
  • qq_35212671
  • qq_35212671
  • 2016年11月24日 22:16
  • 862

Android进程间通信方式总结(IPC)

第一种:Intent方式 Intent分为两种,一种是显式Inten
  • bill_sha
  • bill_sha
  • 2014年09月15日 19:00
  • 3613

Linux下的进程概论与编程三(进程间通信的5种方式)

Linux下的进程概论与编程一(进程概念与编程)Linux下的进程概论与编程二(进程控制)一、进程间通信1、IPC—-InterProcess Communication 每个进程各自有不同的用户地...
  • snow_5288
  • snow_5288
  • 2017年06月15日 22:37
  • 497

Linux下进程间通信的六种机制详解

Linux下进程间通信的六种机制概览+详解
  • Li_Ning_
  • Li_Ning_
  • 2016年08月05日 13:51
  • 2731

java进程间通信方式

http://bbs.csdn.net/topics/40407223 看到楼主提到进程间通信,又想起了以前使用C编程的时光。 :) 先看看传统的进程间通信的手段有什么,上面的各位都说了不...
  • Kingson_Wu
  • Kingson_Wu
  • 2015年08月23日 17:01
  • 1954

4种进程间通信方式详解

进程间通信有4种方式,以下从简单到复杂的方式出场: 1.管道(pipe)     管道是一种具有两个端点的通信通道,一个管道实际上就是只存在在内存中的文件,对这个文件操作需要两个已经打开文件进行,...
  • u014673901
  • u014673901
  • 2016年04月07日 21:09
  • 13415

Linux进程间通信的几种方式总结-概述

进程通信的目的 数据传输  一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据  多个进程想要操作共享数据,一个进程对共享数据 通知事  一个进程需...
  • ShareUs
  • ShareUs
  • 2016年03月18日 15:55
  • 2519

Linux进程间通信的基本原理、通信方式及其同步方式的理解

***基本原理***: 通常情况下,程序只能访问自身的数据,和其它进程没有沟通,每个进程都是一个单独存在的个体,进程之间不需要协作就可以完成自身的任务了。但随着需要解决问题复杂性的增加,一个进程不可...
  • lp542718520
  • lp542718520
  • 2016年12月07日 15:33
  • 493

Linux进程间的通信方式和原理

进程的概念 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程是一个程序的一次执行过程。 进程通信的概念 进程用户空间是...
  • c15522627353
  • c15522627353
  • 2016年10月30日 17:05
  • 3815

进程间通信的几种方式浅谈(上)

程序员必须让拥有依赖关系的进程集协调,这样才能达到进程的共同目标。可以使用两种技术来达到协调。第一种技术在具有通信依赖关系的两个进程间传递信息。这种技术称做进程间通信(interprocess com...
  • masefee
  • masefee
  • 2009年05月13日 14:43
  • 11618
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下进程间通信方式
举报原因:
原因补充:

(最多只允许输入30个字)