NSTask 简介
使用NSTask
类,你的程序可以运行另一个程序作为子进程并且可以监视程序的执行。NSTask
对象创建一个隔离开的可执行的实体,它与NSThread
的不同之处在于,它不与创建它的进程共享内存空间。
一个任务运行在下列几个值定义的环境中:当前目录,标准输入、标准输出、标准错误,和任何环境变量的值。默认情况下,一个NSTask
对象继承启动它的环境的进程。任务的任何值都应该不同,例如,当前目录应该改变,你必须在运行任务痴情改变值。一个任务的运行时环境是无法改变的。
一个NSTask
对象只能运行一次。之后试图运行任务会产生一个错误。
重要:在沙盒应用程序中,NSTask类创建的子进程继承父应用程序的沙盒。通常你应该写辅助应用程序( XPC Services)作为替代,因为XPC服务允许您指定不同的沙盒不同的权利给helper应用程序。 更多信息查阅 Daemons and Services Programming Guide 和 XPC Services API Reference.
创建和初始化一个NSTask对象
+ launchedTaskWithLaunchPath:arguments:
指定的可执行文件和参数创建和启动一个任务
方法声明
1 2 |
+ (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray<NSString *> *)arguments |
参数
path:可执行文件的路径。
arguments:NSString
对象数组,提供任务的参数。如果参数是nill,产生一个NSInvalidArgumentException
异常
讨论
任务继承其调用这个方法的进程的环境。
NSTask对象把路径和字符串参数转化成适当的c风格的字符串(使用fileSystemRepresentation)通过argv[]传递给任务)。参数的字符串不接受 Shell扩展,所以你不需要做特殊的引用,和shell变量,如$ PWD不会被引用。
– init
在当前进程的环境中返回一个初始化NSTask对象。
声明
1 |
- (instancetype)init |
返回值
在当前进程的环境中返回一个初始化NSTask对象。
讨论
如果您需要修改任务的环境,使用alloc和init, 然后启动新任务之前设置环境。否则,只使用类方法 launchedTaskWithLaunchPath:arguments: 创建和运行任务。
一些属性 返回任务信息
@property(copy) NSArray<NSString *> *arguments //NSString对象数组包含调用时使用的参数。
@property(copy) NSString *currentDirectoryPath //任务当前的工作目录
@property(copy) NSDictionary<NSString *,NSString *> *environment //任务启动后的环境变量字典,字典的key是环境变量的名称
@property(copy) NSString *launchPath //可执行文件的路径
@property(readonly) int processIdentifier //进程标识
@property(retain) id standardError //标准错误文件
@property(retain) id standardInput //任务使用的标准输入文件,除非另有说明。返回的对象是一个NSFileHandle或者一个NSPipe实例,这取决于传递给setStandardInput:方法哪种类型的对象。
@property(retain) id standardOutput //任务使用的标准输出文件,标准输出用来作为任务显示其输出。返回的对象是一个NSFileHandle或者一个NSPipe实例,这取决于传递给setStandardOutput:方法哪种类型的对象。
运行和停止任务
- interrupt
发送一个中断信号给接受者和它的所有子任务。
声明
1 |
- (void)interrupt |
讨论
如果任务因此终止,这是默认的行为,一个NSTaskDidTerminateNotification
发送到默认的通知中心。如果消息接收者已经启动或者已经执行完成,这个方法没有效果。如果消息接收者尚未启动,该方法发出了一个NSInvalidArgumentException
。
- launch
声明
1 |
- (void)launch |
讨论
如果运行路径没有设置或者是无效的或者不能创建一个过程,发出一个NSInvalidArgumentException
- resume
恢复执行之前suspend的任务。
返回值
YES,如果任务能够恢复执行,否则NO。
讨论
如果多个suspend发送到任务,任务继续执行之前发送同等数量的resume消息。
- suspend
暂停任务的执行。
声明
1 |
- (BOOL)suspend |
返回值
如果任务暂停成功 返回YES,否则NO
讨论
多个暂停消息可以被发送,但是任务继续执行之前,他们必须与同等数量的resume
消息平衡。
- terminate
发出终止信号给任务和它的所有子任务。
声明
1 |
- (void)terminate |
讨论
如果任务因此终止,这是默认的行为,一个NSTaskDidTerminateNotification
发送到默认的通知中心。如果任务已经启动或者已经执行完成。这个方法不会有效果。如果任务尚未启动,该方法产生一个NSInvalidArgumentException
。
并不总是有可能终止任务,因为它可能忽略了终止信号。终止发送SIGTERM
。
waitUntilExit
block,直到任务完成。
声明
1 |
- (void)waitUntilExit |
讨论
该方法首先检查是否有任务在使用 isRunning标识运行。然后阻塞当前run loop(使用NSDefaultRunLoopMode)直到任务完成。
1 2 3 4 5 6 7 8 9 10 |
NSTask *task = // Create and initialize a task [task launch]; [task waitUntilExit]; int status = [task terminationStatus]; if (status == 0) { NSLog(@"Task succeeded."); } else { NSLog(@"Task failed."); } |
waitUntilExit
并不保证terminationHandler block 在waitUntilExit返回之前已经被完全执行。
查询任务状态
- isRunning
返回任务是否仍在运行
声明
1 |
- (BOOL)isRunning |
返回值
YES,如果任务仍在运行。否则返回NO,NO意味着任务无法运行或者被终止
- terminationStatus
声明
1 |
@property(readonly) int terminationStatus |
返回值
任务的可执行文件返回退出状态
讨论
每个任务定义和文档应该如何解释它的返回值。例如,许多命令如果他们成功完成或如果他们没有一个错误代码会返回0,。你需要看一下任务的文档学习它在什么情况下返回什么值。
如果接收方仍在运行。该方法产生一个NSInvalidArgumentException
。确认在你使用它前,任务没有运行。
1 2 3 4 5 6 7 8 9 |
NSTask *task = // Create and initialize a task if (![task isRunning]) { int status = [task terminationStatus]; if (status == 0) { NSLog(@"Task succeeded."); } else { NSLog(@"Task failed."); } } |
- terminationReason
返回被终止的原因
声明
1 |
@property(readonly) NSTaskTerminationReason terminationReason |
返回值
终止状态。可能的值在NSTaskTerminationReason 中描述。
配置一个NSTask对象
- arguments
设置命令参数,用于启动可执行文件。
声明
1 |
@property(copy) NSArray<NSString *> *arguments |
参数
arguments:NSString
对象数组,提供任务的参数。如果参数是nill,产生一个NSInvalidArgumentException
异常
讨论
NSTask对象把路径和字符串参数转化成适当的c风格的字符串(使用fileSystemRepresentation)通过argv[]传递给任务)。参数的字符串不接受 Shell扩展,所以你不需要做特殊的引用,和shell变量,如$ PWD不会被引用。
任务终止处理程序
terminationHandler
在任务完成时调用。
声明
1 |
@property(copy, nonnull) void (^terminationHandler)( NSTask *) |
讨论
当任务已经完成时,调用完成block。任务对象传递给block允许访问任务参数,例如确定任务成功完成。
block不能保证完全waitUntilExit
返回之前执行。
转载请注明:天狐博客 » Cocoa开发之NSTask