精华内容
下载资源
问答
  • 进程间通讯方式

    2018-08-09 16:10:45
    一、进程间通讯:每个进程各自有不同的用户地址空间,任何一个进程的全局...二、进程间通讯方式:信号,管道,信号量,共享内存,消息队列,socket 0、信号是系统提前规定好的一些特定的事件,信号可以被产生,也...

    一、进程间通讯:每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区,进程B再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

    二、进程间通讯方式:信号,管道,信号量,共享内存,消息队列,socket

    0、信号是系统提前规定好的一些特定的事件,信号可以被产生,也可以被接收,产生和接收信号的主体都是进程。

    接收信号的三种响应方式:忽略(SIG_IGN),默认(SIG_DFL),自定义(自定义的函数)

    进程修改信号响应方式的函数:

    typedef  void  (*Fun_Handle_t )(int);

    Fun_Handle_t(int sig,Fun_Handle_t   fun);//将信号和自定义的处理函数绑定

    int   kill(pid_t  pid,int  sig);//向指定的进程发送指定的信号,进程接收到信号,触发相应的响应函数

    1、管道(管道容量:64k):半双工通讯

     管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失。

    有名无名区别:

     (1)有名管道:在文件目录树中有文件标识,无名管道没有

     (2)使用限制:

    有名管道:任意一个有权限访问管道文件的进程,可以让同一台计算机上的任何两个没有关系的进程通信;

    无名管道:无名管道要想完成进程通讯,必须借助于父子进程共享fork之前打开的文件描述符;即需要通信的进程之间必须存在关系。

    操作过程

    (1)父进程创建管道,得到两个⽂件描述符指向管道的两端

    (2)父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。

    (3)父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。 

    注意

    如果一个进程以只写的方式打开一个管道文件,open函数不会立即返回,会阻塞运行,知道另一个进程以只读的方式打开文件。

    2、信号量

      1) 信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。

      2)只允许对它进行两个操作:

    信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;

    当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。

      3)在信号量进行PV操作时都为原子操作(因为它需要保护临界资源)

    原子操作:不会被线程调度机制打断的操作

      4)进程如何获得共享资源

    (1)测试控制该资源的信号量

    (2)信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位

    (3)若此时信号量的值为0,则进程进入挂起状态(进程状态改变),直到信号量的值大于0,若进程被唤醒则返回至第一步。

    注:信号量通过同步与互斥保证访问资源的一致性。

    关于PV操作容易产生的一些疑问:

    1)S大于0那就表示有临界资源可供使用,为什么不唤醒进程?

    S大于0的确表示有临界资源可供使用,也就是说这个时候没有进程被阻塞在这个资源上,所以不需要唤醒。

    2)S小于0应该是说没有临界资源可供使用,为什么还要唤醒进程?

    V原语操作的本质在于:一个进程使用完临界资源后,释放临界资源,使S加1,以通知其它的进程,这个时候如果S<0,表明有进程阻塞在该类资源上,因此要从阻塞队列里唤醒一个进程来“转手”该类资源。比如,有两个某类资源,四个进程A、B、C、D要用该类资源,最开始S=2,当A进入,S=1,当B进入S=0,表明该类资源刚好用完, 当C进入时S=-1,表明有一个进程被阻塞了,D进入,S=-2。当A用完该类资源时,进行V操作,S=-1,释放该类资源,因为S<0,表明有进程阻塞在该类资源上,于是唤醒一个。

     

    3)如果是互斥信号量的话,应该设置信号量S=1,但是当有5个进程都访问的话,最后在该信号量的链表里会有4个在等待,也是说S=-4,那么第一个进程执行了V操作使S加1,释放了资源,下一个应该能够执行,但唤醒的这个进程在执行P操作时因S<0,也还是执行不了,这是怎么回事呢?

    当一个进程阻塞了的时候,它已经执行过了P操作,并卡在临界区那个地方。当唤醒它时就立即进入它自己的临界区,并不需要执行P操作了,当执行完了临界区的程序后,就执行V操作。

    4)S的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?

    当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。

    3、共享内存:

    这是最快的一种IPC(IPC通讯:信号量,共享内存,消息队列)

        (1) 允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC。

       (2)  共享内存中的数据并不会像管道或者信号量等被一端读取之后就不存在。

       (3)优点:使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。同时,它也不像无名管道那样要求通信的进程有一定的父子关系。
      缺点:共享内存没有提供互斥同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段比如信号量等来进行进程间的同步工作。 

    4、消息队列

    消息:数据+类型         队列:先进先出的一种数据结构

    传递的数据是带有type的,不同的进程可以根据不同的需要获取不同类型的数据;如果队列中同一类型的数据有很多条,则采用队列先进先出的原则获取数据。

      (1) 消息队列是消息的链接表,存放在内核中并由消息队列标识符标识(key)。 

    标识符是IPC对象的内部名, 而它的外部名则是key(键), 它的基本类型是key_t, 在头文件<sys/types.h>中定义为长整型.。键由内核变换成标识符。

      (2)用户可以从消息队列中读取数据和添加消息,其中发送进程添加消息到队列的末尾,接收进程在队列的头部接收消息;消息一旦被接收,就会从队列中删除。和FIFO有点类似,但是它可以实现消息的随机查询,比FIFO具有更大的优势(比如按消息的类型字段取消息)。

      (3)与FIFO不同的是:消息队列可以制定从消息队列中取走某一条消息

     

    展开全文
  • iOS进程间通讯方式

    2020-08-24 20:51:52
    iOS 进程间通讯方式: 解释 URL Scheme 这个是iOS app通信最常用到的通信方式,App1通过openURL的方法跳转到App2,并且在URL中带上想要的参数,有点类似http的get请求那样进行参数传递。这种方式是使用最多的最...

    iOS 进程间通讯方式:

    在这里插入图片描述

    解释

    1. URL Scheme

      这个是iOS app通信最常用到的通信方式,App1通过openURL的方法跳转到App2,并且在URL中带上想要的参数,有点类似http的get请求那样进行参数传递。这种方式是使用最多的最常见的,使用方法也很简单只需要源App1在info.plist中配置LSApplicationQueriesSchemes,指定目标App2的scheme;然后在目标App2的info.plist中配置好URL types,表示该app接受何种URL scheme的唤起。

    2. KeyChain

      iOS系统的Keychain是一个安全的存储容器,它本质上就是一个sqllite数据库,它的位置存储在/private/var/Keychains/keychain-2.db,不过它所保存的所有数据都是经过加密的,可以用来为不同的app保存敏感信息,比如用户名,密码等。iOS系统自己也用keychain来保存VPN凭证和Wi-Fi密码。它是独立于每个App的沙盒之外的,所以即使App被删除之后,Keychain里面的信息依然存在。

      基于安全和独立于app沙盒的两个特性,Keychain主要用于给app保存登录和身份凭证等敏感信息,这样只要用户登录过,即使用户删除了app重新安装也不需要重新登录。

      那Keychain用于App间通信的一个典型场景也和app的登录相关,就是统一账户登录平台。使用同一个账号平台的多个app,只要其中一个app用户进行了登录,其他app就可以实现自动登录不需要用户多次输入账号和密码。一般开放平台都会提供登录SDK,在这个SDK内部就可以把登录相关的信息都写到keychain中,这样如果多个app都集成了这个SDK,那么就可以实现统一账户登录了。

    3. UIPasteboard

      UIPasteboard是剪切板功能,因为iOS的原生控件UITextView,UITextField 、UIWebView,我们在使用时如果长按,就会出现复制、剪切、选中、全选、粘贴等功能,这个就是利用了系统剪切板功能来实现的。而每一个App都可以去访问系统剪切板,所以就能够通过系统剪贴板进行App间的数据传输了。

    4. UIDocumentInteractionController

      UIDocumentInteractionController主要是用来实现同设备上app之间的共享文档,以及文档预览、打印、发邮件和复制等功能。它的使用非常简单.

      首先通过调用它唯一的类方法 interactionControllerWithURL:,并传入一个URL(NSURL),为你想要共享的文件来初始化一个实例对象。然后UIDocumentInteractionControllerDelegate,然后显示菜单和预览窗口。

    5. App Groups

      App Group用于同一个开发团队开发的App之间,包括App和Extension之间共享同一份读写空间,进行数据共享。同一个团队开发的多个应用之间如果能直接数据共享,大大提高用户体验。

    6. local socket

      这种方式不太常见,也是很容易被iOS开发者所忽略但是特别实用的一种方法。它的原理很简单,一个App1在本地的端口port1234进行TCP的bind和listen,另外一个App2在同一个端口port1234发起TCP的connect连接,这样就可以建立正常的TCP连接,进行TCP通信了,那么就想传什么数据就可以传什么数据了。

      这种方式最大的特点就是灵活,只要连接保持着,随时都可以传任何相传的数据,而且带宽足够大。它的缺点就是因为iOS系统在任意时刻只有一个app在前台运行,那么就要通信的另外一方具备在后台运行的权限,像导航或者音乐类app。

      它是常用使用场景就是某个App1具有特殊的能力,比如能够跟硬件进行通信,在硬件上处理相关数据。而App2则没有这个能力,但是它能给App1提供相关的数据,这样APP2跟App1建立本地socket连接,传输数据到App1,然后App1在把数据传给硬件进行处理。

    7. AirDrop

      通过AirDrop实现不同设备的App之间文档和数据的分享;

    8. UIActivityViewController

      iOS SDK中封装好的类在App之间发送数据、分享数据和操作数据;

    其他

    • UIDocumentInteractionController和UIActivityViewController区别:UIDocumentInteractionController处理文件,而UIActivityViewController处理您应用程序中的各种其他服务.

    • 所有的进程间通讯最终落实依赖的还是Mach内核API提供的功能。Mach端口是轻量并且强大的而又缺少相关文档晦涩使用的。Core Foundation和Foundation为Mach端口提供了高级API。在内核基础上封装的CFMachPort / NSMachPort可以用做runloop源,尽管CFMachPort / NSMachPort有利于的是两个不同端口之间的通讯同步。

    • iOS进程间通讯原理:https://nshipster.com/inter-process-communication/

    展开全文
  • 现在虽说有各种各样的中间件来处理进程间通讯,但知道linux本身提供的进程间通讯方式还是很有必要的。 Linux间通讯主要有以下几种: 1.管道 a)匿名管道 b) 命名管道 2.套接字 3.共享内存 4.信号 5....

        现在虽说有各种各样的中间件来处理进程间通讯,但知道linux本身提供的进程间通讯方式还是很有必要的。

         Linux间通讯主要有以下几种:

        1.管道

             a) 匿名管道

             b)  命名管道

        2.套接字

        3. 共享内存

       4.信号

       5.消息队列

     

       下面主要讲下常用的管道、套接字、共享内存

       管道通信

        管道有两种,一种是适合父子进程间通讯的匿名管道,另外一种是不相关进程的命名管道。

       1.匿名管道

              使用pipe来创建管道,我们来看一下这个函数原定义:

              int pipe(int filedes[2])

              这个函数返回一个管道数组,一个读、一个写。只要内存足够大,可以随便写。如果发现内存不够,则会阻塞。

      2.命名管道

           顾名思义,就是给管道取了个名字,以便两个进程访问。其定义如下:

           int mkfifo(const char *filename, mode_t mode);   

         在创建成功后,两个进程即可使用文件API来操作,使用open来打开, read,write来读写

     

        套接字

        socket一般使用在两台不同IP的机器上的进程通讯,虽然同一台机器上两个进程也可以通过环回接口来通讯,但效率不高。

        不过linux提供了另外一种socket类型来解决这个问题,通过设定套接字类型为PF_UNIX 及指定地址(而不是IP地址)来解决本地进程通讯的问题。传统socket会经过协议层的编码解码且经过网卡,并受网卡带宽限制,而本地套接字则没有此种过程,内核直接根据指定的地址,拷贝数据,如此效率得到极高的提升。

      共享内存

        如其名,就知道是两个进程访问同一块内存来进行读写,则不存在数据的拷贝了,这个也分三种:

       1.mmap共享内存映射

       2.XSI共享内存 

       3. POSIX共享内存映射

       mmap适用于父子进程,通过mmap映射出一块内存,然后把地址传给子进程,就可以共享内存了。

       XSI共享内存则是为解决非父子进程的通讯而生,其通过使用一个约定好的文件路径和projectid来生产一个key,两个进程通过该key获取内核创建好的共享内存,进而把共享内存映射到本进程的虚拟地址就可以使用了。

       POSIX共享内存与上面的两种没太大区别,只是为了创建负责linux的价值观(万物皆文件)来提供一套专门的API。

           

        

    展开全文
  • Android 进程间通讯方式 1、通过单向数据管道传递数据 管道(使用PipedWriter/ 创建PipedReader)是java.io包的一部分。也就是说,它们是一般的Java功能,而不是Android特定的。管道为同一进程内的两个线程提供了一种...

    Android 进程间通讯方式

    1、通过单向数据管道传递数据

    管道(使用PipedWriter/ 创建PipedReader)是java.io包的一部分。也就是说,它们是一般的Java功能,而不是Android特定的。管道为同一进程内的两个线程提供了一种连接和建立单向数据通道的方法。生产者线程将数据写入管道,而使用者线程从管道读取数据。

    2、共享内存通信

    共享内存(使用编程中已知的内存区域作为堆)是在线程之间传递信息的常用方法。应用程序中的所有线程都可以访问进程中的相同地址空间。

    3、实现消费者 - 生产者模式 BlockingQueue

    线程信令是一种低级,高度可配置的机制,可以适应许多用例,但它也可能被认为是最容易出错的技术。因此,Java平台在线程信令机制上构建高级抽象,以解决线程之间的任意对象的单向切换。抽象通常被称为“解决生产者 - 消费者同步问题。”问题包括可能存在生成内容的线程(生产者线程)和消费内容的线程(消费者线程)的用例。生产者将消息传递给消费者进行处理。线程之间的中介是具有阻塞行为的队列,即java.util.concurrent.BlockingQueue。

    4、消息队列

    消息处理机制是Android平台的基础,API位于android.os包中,其中包含一组实现该功能的类Handler。

    android.os.Looper
    与唯一的消费者线程关联的消息调度程序。

    android.os.Handler
    消费者线程消息处理器,以及生产者线程将消息插入队列的接口。Looper可以有许多关联的处理程序,但它们都将消息插入到同一队列中。

    android.os.MessageQueue
    要在消费者线程上处理的无限链接消息列表。每个Looper和Thread-最多只有一个MessageQueue。

    android.os.Message
    要在使用者线程上执行的消息。

    原文链接

    转载于:https://www.cnblogs.com/hejing-michael/p/android-jin-cheng-jian-tong-xun-fang-shi.html

    展开全文
  • android进程间通讯方式

    千次阅读 2015-09-29 19:52:32
    android进程间通讯方式 1、进程,android给每个组件Activity,Service,Brocast,等等都提供了process这个标签值, 我们可以定义这些UI组件在哪个process中运行。   2、android 中的service都是在独立的process...
  • 二、进程间通讯方式 1、管道 (1)有名管道(也称为命名管道) (2)无名管道 2、信号量 临界资源、临界区、同步/异步,P/V操作,阻塞/非阻塞,同步/互斥 (1)何为信号量? (2)信号量的使用 (3)P/V操作...
  • Linux进程间通讯方式:6种 1.传数据:半双工管道(单向传输) FIFO管道文件(又称半双工管道) 消息队列 共享内存 套接字 2.不能传数据:信号量
  • Linux 子系统及进程间通讯方式 参考连接:http://naotu.baidu.com/file/0b795205c5a27a0eb8eb3b094afae1e6?token=f93f0b3c2d012e3e 参考连接:...
  • 命名管道(FIFO):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 信号(signal)信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给...
  • 进程间通讯方式以及各个方式的优缺点 2014-7-19阅读99 评论0 进程通信的含义 进程是转入内存并准备执行的程序,每个程序都有私有的虚拟地址空间,由代码,数据以及它可利用的系统资源(如文件,管道)组成.多进程/多...
  • 进程间通讯方式分类

    2019-09-04 16:47:24
     无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 2、高级管道通信  高级管道(popen):将另一个程序当做一个新...
  • 展开全部进程间通信的方法主要有以下几种:(1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另32313133353236313431303231363533e78988e69d8331333332616461一个与它有共同祖先的进程之间进行...
  • Linux进程间通讯方式

    2018-07-23 23:46:22
    我们常常使用的进程间通讯主要有信号、管道、共享内存、消息队列、信号量、socket这六种方式。 (一)信号 (1)它是一种通知机制;一种提前定义好的某些特定事件。信号可以被产生也可以被接收;信号最重要的就是...
  • 消息队列 基于消息的模式适合单对单通讯,因为一条消息只能被一个对象消费,且是抢占的模式,所以不适合一对多通讯。 消费端需要轮训获取消息。 管道 ...一种计数器,用来实现进程间的加锁操作。 ...
  • 进程间通讯方式以及各个方式的优缺点 转载自:http://blog.csdn.net/u014774781/article/details/45485735 进程通信的含义  进程是转入内存并准备执行的程序,每个程序都有私有的虚拟地址空间,由代码,数据...
  • linux 进程间通讯方式

    2017-12-17 16:58:09
    1 无名管道通信无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。2 高级管道通信高级管道(popen):将另一个程序当做一...
  • 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 4.信号量:不能传递复杂消息,只能用来同步 5.共享内存区:能够很容易控制容量,...
  • 进程间通讯方式——共享内存 共享内存是一种最为高效的进程间通讯方式,进程可以直接读写内存,不需要任何数据的复制。 共享内存的实现主要分为俩个步骤1-创建共享内存 shmget(); 2-映射共享内存shmat(); 当然还有...
  • Linux进程间通讯方式之管道pipe

    千次阅读 2014-04-13 15:11:29
    Linux 进程间通讯方式有以下几种: 1-》管道(pipe)和有名管道(fifo). 2-》消息队列 3-》共享内存 4-》信号量 5-》信号(signal) 6-》套接字(sicket)
  • 进程间通讯方式总结

    2016-04-19 11:01:18
    一、linux系统进程间通信的方式: 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 命名管道 (named pipe): 命名...
  • linux进程间通信方式 管道(pipe),流管道(s_pipe)和有名管道(FIFO) 信号(signal) 消息队列 共享内存 信号量 套接字(socket) linux线程间通信方式 线程间通信方式主要以下几种: 1,锁机制:包括互斥锁、读写锁...
  • Qt_Qtopia与Android的进程间通讯方式

    千次阅读 2010-05-08 13:43:00
    Qt/Qtopia与Android都是支持多进程的,这就涉及到进程间通讯。Qt/Qtopia是跨平台的,不仅可以支持Linux,还...本节来简单了解一下二者对于进程间通讯方式的差别。由于都支持linux,所以先回顾Linux的进程间通讯方式
  •  Linux下进程间通信方式总结 无名管道( pipe ):管道是一种半双工的通信方式,数据只能...就因为它在使用前没有任何的标识,所以也只能适用于父子进程或者具有血缘关系的进程间通讯  有名管道 (named

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,697
精华内容 678
关键字:

进程间通讯方式