iOS逆向进阶:iOS进程间通信方案深入探究与local socket介绍

在移动应用开发中,进程间通信(Inter-Process Communication,IPC)是一项至关重要的技术,用于不同应用之间的协作和数据共享。在iOS生态系统中,进程和线程是基本的概念,而进程间通信方案则为应用的功能拓展和性能优化提供了强大的支持。

1. 进程与线程:操作系统的核心概念

进程是指在操作系统中正在运行的一个独立程序实例。每个进程都拥有独立的内存空间,不同进程之间的数据隔离,通信需要特定的机制。在iOS中,每个应用运行在独立的进程中,这确保了应用之间的隔离性和稳定性。

线程是进程内的执行单元,一个进程可以包含多个线程。线程共享进程的内存空间,这使得它们可以更容易地共享数据。然而,多线程编程也带来了线程同步和竞态条件等复杂性问题。在iOS中,主线程通常处理UI交互,而后台线程执行耗时任务,以保持用户界面的响应性。

下面我们从代码角度讨论一下进程是如何被创建的:

1.1 Linux下进程的创建

在Linux下,可以使用C语言中的系统调用来创建新的进程。其中,fork()是一个常用的系统调用,用于创建一个新的进程,使得父进程和子进程可以并行运行。下面是一个简单的示例代码,展示了如何使用C语言在Linux下创建进程:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t child_pid;

    // 创建新进程
    child_pid = fork();

    if (child_pid < 0) {
        fprintf(stderr, "Fork failed\n");
        return 1;
    } else if (child_pid == 0) {
        // 子进程执行的代码
        printf("This is the child process. PID: %d\n", getpid());
        // 子进程退出
        exit(0);
    } else {
        // 父进程执行的代码
        printf("This is the parent process. Child PID: %d\n", child_pid);
        // 等待子进程结束
        wait(NULL);
        printf("Child process has terminated.\n");
    }

    return 0;
}

在这个例子中,fork()会创建一个新的进程,其中子进程会从fork()返回处开始执行。在子进程中,我们打印子进程的PID,并使用exit(0)来退出子进程。在父进程中,我们打印子进程的PID,然后使用wait(NULL)来等待子进程结束。注意,父进程和子进程在内存空间中是独立的,但它们共享文件描述符等资源。

1.2 iOS中编译运行上述代码

在iOS平台上,你无法直接使用fork()来创建进程,因为iOS的应用程序在沙箱环境中运行,对于进程的管理和创建有一些限制。在iOS上,进程的创建和管理是由系统控制的,通常是由应用程序的主线程启动的。你可以正常编译运行,但尝试调用fork()函数会导致应用崩溃。

1.3 fork() 的底层原理

在这里插入图片描述

为了更好理解进程间通信,我们来介绍一下调用fork()时,操作系统的底层发生了哪些变化:

复制进程: 当一个进程调用fork()时,操作系统会创建一个新的进程,称为子进程。子进程是父进程的副本,包括了父进程的所有内存、文件描述符和其他资源。
复制内存空间: 子进程的地址空间会与父进程一样,但是子进程会获得一个独立的副本。这是通过"写时复制"(Copy-On-Write)机制实现的,意味着一开始父子进程共享内存,但如果任何一个进程修改了内存内容,操作系统会为修改的部分创建一个新的副本。
分配进程ID: 操作系统为子进程分配一个唯一的进程标识符(PID)。子进程的PID与父进程不同,但其它属性(如UID、GID等)可能会保持一致。
文件描述符的处理: 子进程会继承父进程的文件描述符。文件描述符是用于访问文件、套接字等I/O资源的句柄。子进程在继承文件描述符后,可以共享相同的文件或网络连接。
返回值: 在父进程中,fork()函数返回子进程的PID(正整数)。在子进程中,fork()函数返回0。如果fork()失败,返回值为负数,表示创建子进程失败。
继续执行: 父进程和子进程都从fork()调用之后的地方继续执行。由于子进程是父进程的副本,它们都从相同的代码位置开始运行。

其中可以特别注意一下"写时复制"的概念,这往往也是大厂面试重点考察的内容,如果感兴趣我们后续会展开介绍,可以关注本专栏以获取最新的文章。

2. iOS中的进程间通信方案

在iOS中,不同应用之间的数据共享和通信需要使用特定的进程间通信方案。以下是一些常见的iOS进程间通信方法:

**URL Scheme:**应用可以通过注册自定义的URL Scheme,在其他应用中通过URL调起目标应用,并传递数据。这通常用于简单的应用跳转和数据分享。
App Groups: App Groups 允许不同应用共享同一组容器目录,用于存储共享数据,如偏好设置和文件等。
Keychain Sharing: Keychain 是用于存储敏感数据的安全容器,应用可以在开发者账号下共享Keychain数据,实现跨应用的数据共享。
Notification: 应用可以使用通知中心发送和接收通知,实现应用间的消息传递。这适用于一对多的通信场景。
Local Socket: iOS进程间也可以通过本地socket方式进行通信,这是一个较为通用的方法,下面我们来详细介绍。

3. 使用Local Socket进行进程间通信

Local Socket 是一种基于网络套接字的进程间通信方法,适用于在同一台设备上的不同进程之间建立通信连接。下面是使用Local Socket进行进程间通信的简要示例代码:

进程1 - 发送数据

import Foundation

let serverURL = URL(fileURLWithPath: "/path/to/socket")
let socket = try! Socket.create(family: .unix, type: .stream, proto: .unix)
try! socket.connect(to: serverURL)

let dataToSend = "Hello, Process 2!".data(using: .utf8)!
try! socket.write(from: dataToSend)
socket.close()

进程2 - 接收数据

import Foundation

let serverURL = URL(fileURLWithPath: "/path/to/socket")
let socket = try! Socket.create(family: .unix, type: .stream, proto: .unix)
try! socket.bind(to: serverURL)
try! socket.listen(maxBacklogSize: 1)

let clientSocket = try! socket.acceptClientConnection()

var receivedData = Data()
_ = try! clientSocket.read(into: &receivedData)
let receivedString = String(data: receivedData, encoding: .utf8)
print("Received data: \(receivedString ?? "")")
clientSocket.close()

iOS进程间通信方案在不同场景下具有不同的优势和用途。我们应根据实际需求选择适合的通信方法,以实现应用之间的数据共享和协作,为用户提供更优质的体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/102046.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

paddle 1-高级

目录 为什么要精通深度学习的高级内容 高级内容包含哪些武器 1. 模型资源 2. 设计思想与二次研发 3. 工业部署 4. 飞桨全流程研发工具 5. 行业应用与项目案例 飞桨开源组件使用场景概览 框架和全流程工具 1. 模型训练组件 2. 模型部署组件 3. 其他全研发流程的辅助…

【大数据实训】基于Hive的北京市天气系统分析报告(二)

博主介绍&#xff1a;✌全网粉丝6W,csdn特邀作者、博客专家、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于大数据技术领域和毕业项目实战✌ &#x1f345;文末获取项目联系&#x1f345; 目录 1. 引言 1.1 项目背景 1 1.2 项目意义 1 2.…

Java代码审计15之Apache log4j2漏洞

文章目录 1、log4j简介2、复现2.1、高版本测试2.2、测试代码2.3、补充之dns探测2.3.1、rmi、ldap也可以dnslog探测 2.3.2、dnslog外带信息 3、漏洞原理3.1、漏洞的危害大的背景3.2、具体的代码调试 4、靶场测试4.1、dns探测4.2、工具下载与使用4.3、测试4.4、手工可以测出&…

设计模式--代理模式

笔记来源&#xff1a;尚硅谷Java设计模式&#xff08;图解框架源码剖析&#xff09; 代理模式 1、代理模式的基本介绍 1&#xff09;代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象2&#xff09;这样做的好处是…

leetcode236. 二叉树的最近公共祖先(java)

二叉树的最近公共祖先 题目描述递归法代码演示 上期经典 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q …

ISO/IEC标准组织介绍(三十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

AI绘画:StableDiffusion实操教程-斗罗大陆2-江楠楠-常服(附高清图下载)

前段时间我分享了StableDiffusion的非常完整的教程&#xff1a;“AI绘画&#xff1a;Stable Diffusion 终极宝典&#xff1a;从入门到精通 ” 尽管如此&#xff0c;还有读者反馈说&#xff0c;尽管已经成功安装&#xff0c;但生成的图片与我展示的结果相去甚远。真实感和质感之…

解决FreeRTOS程序跑不起来,打印调试却提示“Error:..\FreeRTOS\port\RVDS\ARM_CM3\port.c,244“的方法

前言 今天来分享一个不会造成程序编译报错&#xff0c;但会使程序一直跑不起来&#xff0c;并且通过调试会发现有输出错误提示的错误例子分析&#xff0c;话不多说&#xff0c;我们就直接开始分析~ 首先&#xff0c;我们说过这个例子在编译时候没有明示的错误提示&#xff0c…

城市白模三维重建

收费工具&#xff0c;学生党勿扰&#xff0c;闹眼子当勿扰 收费金额&#xff1a;2000元&#xff0c;不能开发票 1 概述 几个月前&#xff0c;一家小公司找我帮忙给他们开发一个程序&#xff0c;可以将一个城市进行白模的三维重建。 报酬大约5K。经过不懈的努力&#xff0c;终于…

Spring 中存取 Bean 的相关注解

目录 一、五大类注解 1、五大类注解存储Bean对象 1.1Controller(控制器储存) 1.2Service(服务存储) 1.3Repository(仓库存储) 1.4Component(组件存储) 1.5Configuration(配置存储) 2、五大类注解小结 2.1为什么要这么多类注解 2.2 五大类注解之间的关系 二、方法注解 1.方法注…

【App端】uni-app使用百度地图api和echarts省市地图下钻

目录 前言方案一&#xff1a;echarts百度地图获取百度地图AK安装echarts和引入百度地图api完整使用代码 方案二&#xff1a;echarts地图和柱状图变形动画实现思路完整使用代码 方案三&#xff1a;中国地图和各省市地图下钻实现思路完整使用代码 前言 近期的app项目中想加一个功…

常见路由跳转的几种方式

常见的路由跳转有以下四种&#xff1a; 1. <router-link to"跳转路径"> /* 不带参数 */ <router-link :to"{name:home}"> <router-link :to"{path:/home}"> // 更建议用name // router-link链接中&#xff0c;带/ 表示从根…

RT-Thread 原子操作

原子操作简介 原子操作&#xff08;Atomic operation&#xff09;是指一种不可分割的操作&#xff0c;要么完全执行成功&#xff0c;要么完全不执行。 原子操作的执行过程中不允许有任何中断&#xff0c;如果出现了中断&#xff0c;那么操作的结果就无法保证。 原子操作通常…

Docker从认识到实践再到底层原理(二-1)|容器技术发展史+虚拟化容器概念和简介

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

为什么要学习C++

操作系统历史 UINX操作系统诞生之初是用汇编语言编写的。随着UNIX的发展&#xff0c;汇编语言的开发效率成为一个瓶颈。寻找新的高效开发语言成为UNIX开发者需要解决的问题。当时BCPL语言成为了当时的选择之一。Ken Thomposn对BCPL进行简化得到了B语言。但是B语言不是直接生成…

无涯教程-Android - List fragments函数

框架的ListFragment的静态库支持版本&#xff0c;用于编写在Android 3.0之前的平台上运行的应用程序&#xff0c;在Android 3.0或更高版本上运行时,仍使用此实现。 List fragment 的基本实现是用于创建fragment中的项目列表 List in Fragments 示例 本示例将向您说明如何基于…

【GUI开发】用python爬YouTube博主信息,并开发成exe软件

文章目录 一、背景介绍二、代码讲解2.1 爬虫2.2 tkinter界面2.3 存日志 三、软件演示视频四、说明 一、背景介绍 你好&#xff0c;我是马哥python说&#xff0c;一名10年程序猿。 最近我用python开发了一个GUI桌面软件&#xff0c;目的是爬取相关YouTube博主的各种信息&#…

2.5 关系查询优化

这段话主要讨论了关系模型在数据库领域中的查询优化问题。以下是对这段文字的简要解释&#xff1a; 1. **关系模型的优缺点**&#xff1a;虽然关系模型有许多优点&#xff0c;但它也有一些缺点&#xff0c;最主要的缺点是查询效率。如果没有适当的优化&#xff0c;查询的速度可…

采用ROUANT 方法对 nex-gddp-cmip6 数据进行精度校正

专题一 CMIP6中的模式比较计划 1.1 GCM介绍全球气候模型&#xff08;Global Climate Model, GCM&#xff09;&#xff0c;也被称为全球环流模型或全球大气模型&#xff0c;是一种用于模拟地球的气候系统的数值模型。这种模型使用一系列的数学公式来描述气候系统的主要组成部分…

C++面试题(丝)-计算机网络部分(1)

目录 1计算机网络 53 简述epoll和select的区别&#xff0c;epoll为什么高效&#xff1f; 54 说说多路IO复用技术有哪些&#xff0c;区别是什么&#xff1f; 55 简述socket中select&#xff0c;epoll的使用场景和区别&#xff0c;epoll水平触发与边缘触发的区别&#xff1f;…