`
zjjzmw1
  • 浏览: 1373029 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

进程间通信

    博客分类:
  • iOS
阅读更多

进程间通信

 

进程间通信IPCInter-Process Communication),指至少两个进程线程间传送数据或信号的一些技术或方法。线程是计算机系统分配资源的最小单位。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。这些进程可以运行在同一计算机上或网络连接的不同计算机上。

进程间通信技术包括消息传递、同步、共享内存和远程过程调用IPC是一种标准的Unix通信机制。

 

受限与iOS系统的运行机制,绝大多数情况下一个应用在进入后台后会马上进入suspendterminate状态,也就是说不能执行代码,iOS中也没有类似WIndowsService的概念,但存在某些例外:

1:有某些重要的任务,例如保存用户数据,网络下载等,可以申请一段时间的background运行时间,但时间段内能进行的操作比较有限,且有时间限制,长度为600秒左右。

2:某些特定类型的应用,具体包括:

 

  •     VoIP应用
  •     定位类应用
  •     新闻类应用
  •     音乐类应用

这些类型的应用可以获得没有时间限制的background运行。但并不是你随便声明一下应用类型就可以了,如果挂羊头卖狗肉,是无法通过App Store审核的。

 

 

既然大多数情况下系统中只有一个活动的应用在运行,加上iOS内不同应用由于沙箱运行导致的高度隔离,我们熟悉的那些IPC方法,例如管道、邮槽、共享内存、Socket等,往往会显得比较无力了,针对此种情况,苹果也提供了对应的解决方案,也就是我们今天将要介绍的:URL Schema

 

 

简单来说,URL Schema就是iOS内的应用调用协议,应用A可以声明自定义的调用协议,就如http/https那样,当另一个应用B打算在应用内打开应用A时,可以打开使用A自定义的协议开头的URL来打开A,除了协议头,URL中还可以附加其他参数,具体过程参见下图:

alocola-flowchart.png

这个就是SafariAlocola之间的交互过程。

 

接下来介绍一下自定义URL Schema的过程。

 

1:创建Xcode项目

 

2:打开项目,在其中的info.plist中添加如下图所示字段:

 

1343195413_5556.png

其中的"lifengzhong"便是我为此应用注册的自定义协议名称,其他应用如果想调用我的应用,只要打开形似:“lifengzhong://XXX”URL便可以了。

 

3:在项目AppDelegate中添加函数:

[cpp] view plaincopy

 

  1. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation  
  2. {  
  3.     if ([sourceApplication isEqualToString: @"xxx.xxx.xxx"]) {  
  4.         //xx  
  5.     }  
  6.     return YES;  
  7. }  

 

此函数便是URL Call的处理函数了,每当其他应用通过URL打开此应用时,该函数都会被调用。

参数url是传进的urlsourceApplication是呼叫应用的bundle identifier,通过此参数,应用可以对呼叫的应用进行过滤。annotation是呼叫过程中可以附加的额外参数,这里没有用到。

 

4:当另一个应用想调用我的应用时,只需拼接好URL,,然后打开URL即可,十分方便:

 

[cpp] view plaincopy

 

  1. NSURL* url = [NSURL URLWithString: @"lifengzhong://1,545166"];  
  2. [[UIApplication sharedApplication] openURL: url];  

 

这里的1,545166是我自定义的参数,你可以根据自己需要定义URL的格式。

 

 

 

 

通过上面介绍的URL Schema方法,算是实现了某种程度的进程间通信,但这种方式的一个缺点是,同一时刻还是只能有一个进程在前台,主动呼叫的应用在调用成功后必须进入后台,所以能传递的只有URL中所带的参数或annotation中所带的参数。调用的过程中会出现应用之间的切换,用户体验不好。但聊胜于无,苹果好歹还是留了这么一个口子,感恩吧。

 

 

现在我们知道,socketTCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如createlistenacceptconnectreadwrite等等。

         现在我们明白,如果一个程序创建了一个socket,并让其监听80端口,其实是向TCP/IP协议栈声明了其对80端口的占有。以后,所有目标是80端口的TCP数据包都会转发给该程序(这里的程序,因为使用的是Socket编程接口,所以首先由Socket层来处理)。所谓accept函数,其实抽象的是TCP的连接建立过程。accept函数返回的新socket其实指代的是本次创建的连接,而一个连接是包括两部分信息的,一个是源IP和源端口,另一个是宿IP和宿端口。所以,accept可以产生多个不同的socket,而这些socket里包含的宿IP和宿端口是不变的,变化的只是源IP和源端口。这样的话,这些socket宿端口就可以都是80,而Socket层还是能根据源/宿对来准确地分辨出IP包和socket的归属关系,从而完成对TCP/IP协议的操作封装!而同时,放火墙的对IP包的处理规则也是清晰明了,不存在前面设想的种种复杂的情形。

         明白socket只是对TCP/IP协议栈操作的抽象,而不是简单的映射关系,这很重要!


分享到:
评论

相关推荐

    Python中的进程间通信

    Python中的进程间通信(IPC,Inter-Process Communication)是指不同进程之间交换信息的方式。在多进程编程中,由于进程间的独立性,它们不能直接访问彼此的内存空间,因此需要通过特定的方法来协调和同步进程间的...

    C# 进程间通信 共享内存

    共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。...1、进程间通信 2、共享内存 3、托管方式与非托管共享内存

    进程间通信_进程间通信_

    进程间通信(IPC,Inter-Process Communication)是操作系统中一种重要的技术,允许不同的进程之间交换数据、协调工作。在C#编程中,实现进程间通信有很多种方法,每种方法都有其适用场景和优缺点。本篇文章将深入...

    C#使用SendMessage实现进程间通信的方法

    在C#编程中,进程间通信(IPC,Inter-Process Communication)是一种允许不同进程之间交换数据的技术。在本文中,我们将探讨如何使用Windows API中的`SendMessage`函数在两个C#进程中实现这一通信方式。 `...

    Linux进程间通信

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间共享数据、交换信息的一种机制。它是多任务环境下实现协作和同步的重要手段。Linux提供了多种进程间通信方式,包括管道(Pipe)、...

    Messenger进程间通信

    在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序或同一应用内不同进程之间数据共享和协同工作的重要手段。"Messenger进程间通信"是一种轻量级的IPC方式,常用于简单的双向通信...

    C语言实现进程间通信原理解析

    主要介绍了C语言实现进程间通信原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    进程间通信详解.txt

    面试题目,大公司笔试,行业内最新资讯,优秀的教学资源,很多很详细的例子,非常有助于学习道路上前进,并且是最经典的例子,最经典的教材

    C# 使用管道Pipe在进程间通信

    进程间通信的一种方式,Pipes:管道,分为无名管道:在父子进程间交换数据;有名管道:可在不同主机间交换数据,分为服务器方和客户方,在Win9X下只支持有名管道客户。 1、进程间通信 2、管道Pipe通信

    Windows进程间通信

    在Windows操作系统中,进程间通信(IPC,Interprocess Communication)是一种技术,允许不同的进程之间共享数据、协调工作或交换信息。这种技术对于多线程和多进程应用的开发至关重要,尤其是在分布式系统和并发编程...

    Qt进程间通信与同步示例

    在Qt框架中,进程间通信(IPC,Inter-Process Communication)和进程同步是两个关键概念,用于在多个独立运行的程序之间交换数据和协调执行。本示例将深入讲解如何利用Qt库中的特性来实现这些功能,特别是通过QFile...

    chat_进程间通信_

    在IT领域,进程间通信(IPC,Inter-Process Communication)是一种关键的技术,它允许不同的进程之间交换信息,协同工作。本文将深入探讨“聊天”场景下的进程间通信,包括私聊、群聊以及数据传输与共享内存,以及...

    进程间通信例子

    进程间通信(Inter-Process Communication, IPC)是操作系统中一种重要的技术,允许不同进程之间交换数据和信息。在Windows环境中,实现进程间通信有多种方式,包括但不限于管道、消息队列、共享内存、套接字、命名...

    windows 与linux 进程间通信区别

    在操作系统中,进程间通信(IPC)是一种允许不同进程之间进行数据交换和同步操作的重要机制。Windows和Linux作为当前主流的操作系统平台,它们在进程间通信方面有着各自的实现方式和特点。为了帮助开发者了解如何将...

    Linux-进程间通信

    Linux进程间通信是操作系统中进程之间交换信息的重要方式。它涉及多个机制,包括管道、消息队列、信号量、共享内存、套接字和信号。这些机制各具特点,适用于不同的场景。 1. **管道**:管道分为无名管道和命名管道...

Global site tag (gtag.js) - Google Analytics