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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--字典树(trie)

概念&#xff1a; Trie 是一种能够快速插入和查询字符串的多叉树结构。、 节点的编号各不相同&#xff0c;根节点编号为0&#xff0c;其他节点用来标识路径&#xff0c;还可以标记单词的插入次数&#xff0c;边表示字符。 tire 维护字符串的集合&#xff0c;支持两种操作&…

40个Linux常用命令组合

1.删除0字节文件 find -type f -size 0 -exec rm -rf {} \; 2.查看进程 按内存从大到小排列 ps -e -o "%C : %p : %z : %a"|sort -k5 -nr 3.按cpu利用率从大到小排列 ps -e -o "%C : %p : %z : %a"|sort -nr 4.打印说cache里的URL grep -r -a jpg …

accelerate 分布式技巧(一)

accelerate分布式技巧 简单使用 Accelerate是一个来自Hugging Face的库&#xff0c;它简化了将单个GPU的PyTorch代码转换为单个或多台机器上的多个GPU的代码。 Accelerate精确地抽象了与多GPU/TPU/fp16相关的模板代码&#xff0c;并保持Pytorch其余代码不变。 import torchim…

【已解决】pycharm 突然每次点击都开新页面,关不掉怎么办?

今天在 pycharm 中写代码&#xff0c;突然发现&#xff0c;新开的文件不再原来的页面上&#xff0c;而是新增了页面&#xff0c;导致整个屏幕全都是新开的页面&#xff0c;最难受的是&#xff0c;关不掉&#xff01; 无奈&#xff0c;我只能关闭 pycharm&#xff0c;重新双击…

vue权限控制的想法

前言 最近做到了一个权限控制的功能。在这个功能中看到了这个功能的写法&#xff0c;了解到了这个权限控制的功能&#xff0c;也引发了思考。除了 v-if &#xff0c;还有没有更好的&#xff0c;更直观的&#xff0c;更全局的写法呢&#xff1f;带着这个问题&#xff0c;我们先…

openGauss学习笔记-55 openGauss 高级特性-全密态数据库

文章目录 openGauss学习笔记-55 openGauss 高级特性-全密态数据库55.1 连接全密态数据库55.2 创建用户密钥55.3 创建加密表55.4 向加密表插入数据并进行查询 openGauss学习笔记-55 openGauss 高级特性-全密态数据库 全密态数据库意在解决数据全生命周期的隐私保护问题&#xf…

Java LinkedList

简介 链表&#xff08;Linked list&#xff09;是一种常见的基础数据结构&#xff0c;是一种线性表&#xff0c;但是并不会按线性的顺序存储数据&#xff0c;而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 在Java程序设计语言中&#xff0c;所有…

RabbtiMQ的安装与在Springboot中的使用!!!

一、安装Erlang与Rabbitmq 安装教程本教程是在centos8下试验的&#xff0c;其实linux系统的都差不多RabbitMQ官方&#xff1a;Messaging that just works — RabbitMQRabbitMQ是开源AMQP实现&#xff0c;服务器端用Erlang语言编写&#xff0c;Python、Ruby、 NET、Java、JMS、c…

机器学习笔记:轨迹驻留点 staypoint

1 定义 在轨迹数据分析中&#xff0c;"停留点"&#xff08;Staypoint&#xff09;是一个非常关键的概念&#xff0c;它反映了个体或物体在某一地点的停留行为。通常&#xff0c;在一段时间内&#xff0c;如果一个人或物体在一个较小的地理区域内的移动距离低于某个阈…

git查询和设置用户名及邮箱

由于从原来的旧机子换到了新机子&#xff0c;很多东西都需要重新来&#xff0c;包括git&#xff0c;在vscode终端中安装了git&#xff0c;也ssh连到了远程的仓库。以为一切都ok了&#xff0c;在本地完成任务要推到远程时&#xff0c;告诉我说远程不知道我的身份&#xff0c;需要…

攻防世界-WEB-ics-05

打开靶机 只有设备维护中心可以点开 点标签得到新的url pageindex 想到文件包含漏洞&#xff08;URL中出现path、dir、file、pag、page、archive、p、eng、语言文件等相关关键字眼 利用php伪协议查看源码 出现一段base64源码&#xff0c;进行转码得出源码 ?pagephp://filter…

OpenCV(十七):拉普拉斯图像金字塔

1.拉普拉斯图像金字塔原理 拉普拉斯图像金字塔是一种多尺度图像表示方法&#xff0c;通过对高斯金字塔进行差分运算得到。它能够提供图像在不同尺度上的细节信息&#xff0c;常用于图像处理任务如图像增强、边缘检测等。 下面是拉普拉斯图像金字塔的原理和步骤&#xff1a; 构…

pytorch-构建卷积神经网络

构建卷积神经网络 卷积网络中的输入和层与传统神经网络有些区别&#xff0c;需重新设计&#xff0c;训练模块基本一致 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torchvision import datasets,transforms impor…

Agisoft Metashape相机标定笔记

Lens Calibration(镜头标定) 使用Metashape进行自动相机标定是可能的。Metashape使用LCD显示屏作为标定目标&#xff08;可选&#xff1a;使用打印的棋盘格图案&#xff0c;但需保证它是平坦的且单元格是正方形&#xff09;。 相机标定步骤支持全相机标定矩阵的估计&#xff…

pg 配置 -- chatGPT

问&#xff1a;pg 配置不生成 log gpt: 如果你想在 PostgreSQL 中禁用日志记录&#xff08;不生成日志&#xff09;&#xff0c;你可以采取以下步骤&#xff1a; **1. 编辑 PostgreSQL 配置文件&#xff1a;** 打开 PostgreSQL 的配置文件&#xff0c;通常位于 /etc/postgr…

蓝桥杯打卡Day3

文章目录 吃糖果递推数列 一、吃糖果IO链接 本题思路:本题题意就是斐波那契数列&#xff01; #include <bits/stdc.h>typedef uint64_t i64;i64 f(i64 n) {if(n1) return 1;if(n2) return 2;return f(n-1)f(n-2); }signed main() {std::ios::sync_with_stdio(false);s…

kubernetes——ingress

简介 ingress: 是k8s内部的一个资源对象ingress controller -> ingress控制器&#xff1a; 是k8s里启动的一个pod&#xff0c;运行的是nginx的镜像&#xff0c;实现k8s内部的service&#xff08;ClusterIP类型&#xff09;的负载均衡 ingress 和ingress controller 的关…

docker容器运行成功但无法访问,原因分析及对应解决方案(最新,以Tomcat为例,亲测有效)

原因分析&#xff1a; 是否能访问当运行docker容器虚拟机&#xff08;主机&#xff09;地址 虚拟机对应的端口号是否开启或者防墙是否关闭 端口映射是否正确&#xff08;这个是我遇到的&#xff09; tomcat下载的是最新版&#xff0c;docker运行后里面是没有东西的&am…

大厂密集背后,折叠屏市场“暗战”已起

在经过长达10余年的高速增长之后&#xff0c;智能手机行业在过去两年出现了显著的“颓势”&#xff0c;高中低端各个不同市场的分化也越发明显&#xff0c;但新兴的折叠屏市场却滑出了一条“向上”的曲线&#xff0c;引发市场关注。它从形态上颠覆了用户的认知&#xff0c;给市…

单片机-蜂鸣器

简介 蜂鸣器是一种一体化结构的电子讯响器&#xff0c;采用直流电压供电 蜂鸣器主要分为 压电式蜂鸣器 和 电磁式蜂鸣器 两 种类型。 压电式蜂鸣器 主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成&#xff0c;当接通电源后&…