system 函数被废除的替代方法
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,做越狱应用和插件开发,经常会调用 system 去执行系统命令,早在 Xcode 7,使用 system 函数提示警告:'system' is deprecated: first deprecated
千家信息网最后更新 2026年10月31日system 函数被废除的替代方法
做越狱应用和插件开发,经常会调用 system 去执行系统命令,早在 Xcode 7,使用 system 函数提示警告:
'system' is deprecated: first deprecated in iOS 8.0 - Use posix_spawn APIs installd
只是警告,还是可以正常编译和使用,但是升级到 Xcode 9,system 函数就从 SDK 中移除了,不能再使用了,提示:
'system' is unavailable: not available on iOS
替代的方法一般有三种,第一种是使用 posix_spawn,代码如下:
pid_t pid;char *argv[] = { "/bin/ls", //path "-al", //parameter1 "/", //parameter2 NULL}; posix_spawn(&pid, argv[0], NULL, NULL, argv, NULL); printf("pid=%d,child pid = %d\n",getpid(),pid); int stat;waitpid(pid,&stat,0);printf("stat is %d\n",stat);第二种是使用 NSTask,代码如下:
NSTask *task = [[NSTask alloc] init];task.launchPath = @"/bin/ls";task.arguments = [NSArray arrayWithObjects: @"-al", @"/", nil];[task launch];[task waitUntilExit];
NSTask.h 头文件信息如下:
#import@class NSString, NSArray, NSDictionary; @interface NSTask : NSObject // Create an NSTask which can be run at a later time// An NSTask can only be run once. Subsequent attempts to// run an NSTask will raise.// Upon task death a notification will be sent// { Name = NSTaskDidTerminateNotification; object = task; }// - (instancetype)init; // set parameters// these methods can only be done before a launch// if not set, use current// if not set, use current // set standard I/O channels; may be either an NSFileHandle or an NSPipe- (void)setStandardInput:(id)input;- (void)setStandardOutput:(id)output;- (void)setStandardError:(id)error; // get parameters@property (NS_NONATOMIC_IOSONLY, copy) NSString *launchPath;@property (NS_NONATOMIC_IOSONLY, copy) NSArray *arguments;@property (NS_NONATOMIC_IOSONLY, copy) NSDictionary *environment;@property (NS_NONATOMIC_IOSONLY, copy) NSString *currentDirectoryPath; // get standard I/O channels; could be either an NSFileHandle or an NSPipe- (id)standardInput;- (id)standardOutput;- (id)standardError; // actions- (void)launch; - (void)interrupt; // Not always possible. Sends SIGINT.- (void)terminate; // Not always possible. Sends SIGTERM. @property (NS_NONATOMIC_IOSONLY, readonly) BOOL suspend;@property (NS_NONATOMIC_IOSONLY, readonly) BOOL resume; // status@property (NS_NONATOMIC_IOSONLY, readonly) int processIdentifier; @property (NS_NONATOMIC_IOSONLY, getter=isRunning, readonly) BOOL running; @property (NS_NONATOMIC_IOSONLY, readonly) int terminationStatus; @end @interface NSTask (NSTaskConveniences) + (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray *)arguments;// convenience; create and launch - (void)waitUntilExit;// poll the runLoop in defaultMode until task completes @end FOUNDATION_EXPORT NSString * const NSTaskDidTerminateNotification;
如果非要调用 system 函数不可,那就使用第三种方法,找到 system 函数地址直接调用,方法参见: 动态调用函数,具体代码如下:
typedef int (*my_system) (const char *str);int call_system(const char *str){ //动态库路径 char *dylib_path = "/usr/lib/libSystem.dylib"; //打开动态库 void *handle = dlopen(dylib_path, RTLD_GLOBAL | RTLD_NOW); if (handle == NULL) { //打开动态库出错 fprintf(stderr, "%s\n", dlerror()); } else { //获取 system 地址 my_system system = dlsym(handle, "system"); //地址获取成功则调用 if (system) { int ret = system(str); return ret; } dlclose(handle); //关闭句柄 } return -1;}这样 call_system 函数就相当于 system 的功能了,替换即可。
原文地址:https://www.exchen.net/ios-hacker-system-%E5%87%BD%E6%95%B0%E8%A2%AB%E5%BA%9F%E9%99%A4%E7%9A%84%E6%9B%BF%E4%BB%A3%E6%96%B9%E6%B3%95.html
函数
动态
地址
方法
代码
提示
成功
信息
功能
原文
句柄
只是
命令
常会
插件
文件
系统
路径
还是
升级
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡网
金融科技还是互联网
互联网最新的科技有限公司
互联网科技的发展
西安互联网科技公司
易通互联网络科技有限公司
时间互联网络科技
赫美联合互联网科技
国外互联网科技网站
卓越科技互联网 招聘
四个字互联网科技公司取名
湖南诚度互联网科技有限公司
玉溪互联网科技怎么选
互联网方面的科技前沿
广州千川互联网科技有限公司
城市宝互联网科技有限公司
有人说阿里系是互联网科技企业
现代互联网科技公司
河南商务圈互联网科技有限公司
互联网科技自媒体灵感
科技互联网龙头
礼当家互联网科技
鑫亿盛互联网科技
互联网科技大会案例
保险科技服务互联网营销体系
梅州GM互联网络科技有限公司
互联网科技快讯热点
科技和互联网行业的特点
广州全民伙伴互联网科技有限公司
小牛互联网科技有限公司地址