Skip to content

Latest commit

 

History

History
executable file
·
124 lines (90 loc) · 2.94 KB

sysProcess.md

File metadata and controls

executable file
·
124 lines (90 loc) · 2.94 KB

SysProcess系统进程

在Perfect环境下,用户可以通过SysProcess调用系统命令,并允许在调用进程是自定义配套的参数数组和环境变量。部分进程可以立刻被执行并返回结果;其它一些进程则可以处于开通状态,随时可以进行互动性数据读写。

设置

请在您的"Perfect"项目中打开Package.swift设置依存关系:

.Package(
	url: "https://github.com/PerfectlySoft/Perfect.git",
	majorVersion: 3
	)

在具体需要调用系统进程的源代码文件开头,声明PerfectLib库文件并增加linux下SwiftGlibc或macOS的Darwin编译条件:

import PerfectLib

#if os(Linux)
	import SwiftGlibc
#else
	import Darwin
#endif

执行系统进程调用命令

函数方法runProc可以用于带参数数组进行调用系统命令,并可选择是否从命令返回中输出响应结果。

func runProc(cmd: String, args: [String], read: Bool = false) throws -> String? {
	let envs = [("PATH", "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin")]
	let proc = try SysProcess(cmd, args: args, env: envs)
	var ret: String?
	if read {
		var ary = [UInt8]()
		while true {
			do {
				guard let s = try proc.stdout?.readSomeBytes(count: 1024) where s.count > 0 else {
					break
				}
				ary.append(contentsOf: s)
			} catch PerfectLib.PerfectError.fileError(let code, _) {
				if code != EINTR {
					break
				}
			}
		}
		ret = UTF8Encoding.encode(bytes: ary)
	}
	let res = try proc.wait(hang: true)
	if res != 0 {
		let s = try proc.stderr?.readString()
		throw  PerfectError.systemError(Int32(res), s!)
	}
	return ret
}

let output = try runProc(cmd: "ls", args: ["-la"], read: true)
print(output)

注意例子中的SysProcess命令所带环境变量并非在所有系统内通用(请用户根据宿主系统自行输入正确的环境变量以验证本例)。

SysProcess系统进程类成员字段

stdin

stdin即当前文件系统的标准输入流。

stdout

stdout 即当前文件系统的标准输出流。

stderr

stderr 即当前文件系统的标准错误流。

pid

pid 即进程唯一标示符

SysProcess系统进程类成员函数

isOpen

如果当前进程仍处于“开放”状态(即输入输出可读写),则返回真值

注意当前进程不一定处于运行状态,请用wait(false) 方法来检查当前进程是否处于运行状态。

myProcess.isOpen()

close

close 关闭进程并清理内容。

myProcess.close()

detatch

从进程中脱离,以确保即便是该进程进入僵尸态后资源也能够自动释放(即无需再等待进程返回)

myProcess.detatch()

wait

判断该进程是否已经结束运行并读取其返回值。

myProcess.wait(hang: <Bool>)

kill

终止进程并读取其返回值。

myProcess.kill(signal: <Int32 = SIGTERM>)

返回值是一个Int32整型代码