【问题标题】:Use of posix_spawn?使用posix_spawn?
【发布时间】:2017-01-23 11:26:03
【问题描述】:

我尝试从我的应用程序启动命令文件,因此我需要使用“posix_spawn”。但是使用它需要奇怪地使用指针。我没有找到任何 Swift (3.0) 的示例,只有我无法翻译的 C++ 或 Objective C。

我只需要类似的东西(在旧系统调用中):

let err = system("ls -param >file.txt")

有什么想法吗?

编辑: 链接的解决方案不匹配。 首先它不使用编译器提到的 posix_spawn 函数。它使用了 NSTask,这似乎也被放弃了。但我尝试了这个例子,结果是:

func shell(launchPath: String, arguments: [String]) -> String
{
    let task = Process()
    task.launchPath = launchPath
    task.arguments = arguments

    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue)! as String

    return output
}

这里进行了 XCode 8 所需的所有更改。但是调用时,它永远不会从“.launch()”返回。

在输出调试窗口的某处我发现了这一行:

2016-09-15 15:06:36.793 DSRenamer[96562:2569582] launch path not accessible

同样的命令在终端窗口中运行良好:

/usr/local/bin/ExifTool -ext .CR2

【问题讨论】:

  • 我在上面添加了评论。
  • NSTask 并没有被放弃,它只是在 Swift 3 中被重命名为 Process 。你可能没有正确调用它。 "/usr/local/bin/ExifTool" 应该是启动路径,["-ext", ".CR2"] 应该是参数数组。
  • task.waitUntilExit() 将阻塞直到 Process 任务完成。可以使用if task.terminationStatus == 0 { print("Task succeeded.") } 检查结果状态

标签: swift system execute


【解决方案1】:

我用swift调用objective-c方法(虽然不是最好的方法)

  1. 定义一个objective-c util方法

    #import "SystemTaskHelper.h"
    @implementation SystemTaskHelper
    +(void)performSystemTask:(NSString *)task
    {
        system([task UTF8String]);
    }
    @end
    
  2. import objective-c util.h 到 Bridging-Header.h 中,并迅速使用 SystemTaskHelper.performSystemTask("ls -param >file.txt")

【讨论】:

  • iOS系统无法使用
  • 这是 Mac 操作系统
猜你喜欢
  • 2020-10-28
  • 2017-03-24
  • 2016-04-24
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
相关资源
最近更新 更多