最新消息:iOS编程开发交流群(6906921) ,Mac.Cocoa开发交流群(7758675) 欢迎iOS/macOS开发编程爱好及学习者加入!

Cocoa开发之NSTask

Cocoa 天狐 5672浏览 1评论

NSTask 简介

使用NSTask类,你的程序可以运行另一个程序作为子进程并且可以监视程序的执行。NSTask对象创建一个隔离开的可执行的实体,它与NSThread的不同之处在于,它不与创建它的进程共享内存空间。

一个任务运行在下列几个值定义的环境中:当前目录,标准输入、标准输出、标准错误,和任何环境变量的值。默认情况下,一个NSTask对象继承启动它的环境的进程。任务的任何值都应该不同,例如,当前目录应该改变,你必须在运行任务痴情改变值。一个任务的运行时环境是无法改变的。

一个NSTask对象只能运行一次。之后试图运行任务会产生一个错误。

重要:在沙盒应用程序中,NSTask类创建的子进程继承父应用程序的沙盒。通常你应该写辅助应用程序( XPC Services)作为替代,因为XPC服务允许您指定不同的沙盒不同的权利给helper应用程序。 更多信息查阅 Daemons and Services Programming Guide XPC Services API Reference.

创建和初始化一个NSTask对象

 + launchedTaskWithLaunchPath:arguments:

指定的可执行文件和参数创建和启动一个任务

方法声明

参数

path:可执行文件的路径。

arguments:NSString对象数组,提供任务的参数。如果参数是nill,产生一个NSInvalidArgumentException异常

讨论

任务继承其调用这个方法的进程的环境。

NSTask对象把路径和字符串参数转化成适当的c风格的字符串(使用fileSystemRepresentation)通过argv[]传递给任务)。参数的字符串不接受 Shell扩展,所以你不需要做特殊的引用,和shell变量,如$ PWD不会被引用。

– init

在当前进程的环境中返回一个初始化NSTask对象。

声明

返回值

在当前进程的环境中返回一个初始化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

发送一个中断信号给接受者和它的所有子任务。

声明

讨论

如果任务因此终止,这是默认的行为,一个NSTaskDidTerminateNotification发送到默认的通知中心。如果消息接收者已经启动或者已经执行完成,这个方法没有效果。如果消息接收者尚未启动,该方法发出了一个NSInvalidArgumentException

 - launch

声明

讨论

如果运行路径没有设置或者是无效的或者不能创建一个过程,发出一个NSInvalidArgumentException

- resume

恢复执行之前suspend的任务。

返回值

YES,如果任务能够恢复执行,否则NO。

讨论

如果多个suspend发送到任务,任务继续执行之前发送同等数量的resume消息。

 - suspend

暂停任务的执行。

声明

返回值

如果任务暂停成功 返回YES,否则NO

讨论

多个暂停消息可以被发送,但是任务继续执行之前,他们必须与同等数量的resume消息平衡。

 - terminate

发出终止信号给任务和它的所有子任务。

声明

讨论

如果任务因此终止,这是默认的行为,一个NSTaskDidTerminateNotification发送到默认的通知中心。如果任务已经启动或者已经执行完成。这个方法不会有效果。如果任务尚未启动,该方法产生一个NSInvalidArgumentException

并不总是有可能终止任务,因为它可能忽略了终止信号。终止发送SIGTERM

waitUntilExit

block,直到任务完成。

声明

讨论

该方法首先检查是否有任务在使用 isRunning标识运行。然后阻塞当前run loop(使用NSDefaultRunLoopMode)直到任务完成。

waitUntilExit并不保证terminationHandler block 在waitUntilExit返回之前已经被完全执行。

查询任务状态

 -  isRunning

返回任务是否仍在运行

声明

返回值

YES,如果任务仍在运行。否则返回NO,NO意味着任务无法运行或者被终止

 - terminationStatus

声明

返回值

任务的可执行文件返回退出状态

讨论

每个任务定义和文档应该如何解释它的返回值。例如,许多命令如果他们成功完成或如果他们没有一个错误代码会返回0,。你需要看一下任务的文档学习它在什么情况下返回什么值。

如果接收方仍在运行。该方法产生一个NSInvalidArgumentException。确认在你使用它前,任务没有运行。

 - terminationReason

返回被终止的原因

声明

返回值

终止状态。可能的值在NSTaskTerminationReason 中描述。

配置一个NSTask对象

 - arguments

设置命令参数,用于启动可执行文件。

声明

参数

arguments:NSString对象数组,提供任务的参数。如果参数是nill,产生一个NSInvalidArgumentException异常

讨论

NSTask对象把路径和字符串参数转化成适当的c风格的字符串(使用fileSystemRepresentation)通过argv[]传递给任务)。参数的字符串不接受 Shell扩展,所以你不需要做特殊的引用,和shell变量,如$ PWD不会被引用。

任务终止处理程序

terminationHandler

在任务完成时调用。

声明

讨论

当任务已经完成时,调用完成block。任务对象传递给block允许访问任务参数,例如确定任务成功完成。

block不能保证完全waitUntilExit返回之前执行。

 

 

原文:NSTask Class Reference

 

 

 

 

 

 

 

转载请注明:天狐博客 » Cocoa开发之NSTask

微信 OR 支付宝 扫描二维码
为天狐 打赏
非常感谢你的支持,哥会继续努力!
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 如果有一天,我潇洒死去,请记得,我来过这里!
    10049866663年前 (2016-07-10)回复