1.介绍
os
包中提供了操作系统函数的接口,是一个比较重要的包。它的作用主要是在服务器上进行系统的基本操作,如文件操作、目录操作、执行命令、信号与中断、进程、系统状态等等。下面分模块归纳一些常用函数。
2. 系统信息
2.1 函数列表
函数 |
功能 |
Hostname() |
获取当前主机名 |
Getpid() |
返回调用者所在进程的进程ID |
Getppid() |
返回调用者所在进程的父进程的进程ID |
Exit() |
让程序以状态码code退出。状态码0表示成功,非0表示出错。 code取值范围: [0,125] |
2.2 代码示例
a. 示例一
func TestSystemInfo(t *testing.T) { hostname, _ := os.Hostname() fmt.Printf("主机名:%v \n", hostname) fmt.Printf("调用者所在进程的进程ID: %v \n", os.Getpid()) fmt.Printf("调用者所在进程的进程的父进程ID: %v \n", os.Getppid()) }
|
b. 示例二
func TestExit(t *testing.T) { fmt.Println("调用前打印...") os.Exit(0) fmt.Println("调用后,这里不会输出") }
|
3.环境变量
3.1 函数列表
函数 |
功能 |
Environ() |
获取所有环境变量 |
Setenv(key, value string) |
设置环境变量 |
Getenv(key string) |
获取环境变量 |
Clearenv() |
清空所有环境变量 |
3.2 代码示例
func TestEnv(t *testing.T) { fmt.Printf("所有环境变量:%+v \n", os.Environ()) _ = os.Setenv("my-name", "张三") fmt.Printf("获取环境变量: %v \n", os.Getenv("my-name")) os.Clearenv() fmt.Printf("清空环境变量后:%+v \n", os.Environ()) }
|
**输出: **
=== RUN TestEnv 所有环境变量:[PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin __CFBundleIdentifier=com.jetbrains.goland SHELL=/bin/zsh SECURITYSESSIONID=186a6 GOPATH=/Users/hui/go TERM=xterm-256color USER=hui GOROOT=/usr/local/go TMPDIR=/var/folders/8f/vnx2y1h57nzbd2p4vtcl6hv80000gn/T/ LaunchInstanceID=D9F74359-45B7-45F3-B74C-67CEA4DB8D9D COMMAND_MODE=unix2003 GO111MODULE=on SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.5K5WgUh7Hh/Listeners GOPROXY=https://goproxy.cn,direct XPC_FLAGS=0x0 __CF_USER_TEXT_ENCODING=0x1F5:0x19:0x34 LOGNAME=hui XPC_SERVICE_NAME=application.com.jetbrains.goland.15834002.15834933 PWD=/Users/hui/Project/Go/gin-learn/test HOME=/Users/hui GOARCH=amd64 GOBIN=/Users/hui/Project/Go/gopath/bin GOCACHE=/Users/hui/Library/Caches/go-build GOENV=/Users/hui/Library/Application Support/go/env GOHOSTARCH=amd64 GOHOSTOS=darwin GOMODCACHE=/Users/hui/go/pkg/mod GOOS=darwin GOSUMDB=sum.golang.org GOTOOLDIR=/usr/local/go/pkg/tool/darwin_amd64 GCCGO=gccgo AR=ar CC=clang CXX=clang++ CGO_ENABLED=1] 获取环境变量: 张三 清空环境变量后:[] --- PASS: TestEnv (0.00s) PASS
|
4.文件相关
关于文件相关的函数,参见之前的文章 Go学习(二十四):文件操作
5.进程相关
5.1 方法列表
函数名 |
功能 |
os.StartProcess(..) (*Process, error) |
根据提供的参数创建一个新进程 |
p.Signal(sig Signal) |
向进程发送一个信号 |
p.Wait() |
阻塞到进程退出,返回类型*os.ProcessState |
ps.Pid() |
返回一个已退出进程的id |
ps.Exited() |
报告进程是否已退出 |
ps.Success() |
报告进程是否成功退出,在Unix中状态码0代表退出。 |
ps.SystemTime() |
退出进程及子进程耗费的系统CPU时间 |
ps.UserTime() |
退出进程及子进程耗费的用户CPU时间 |
ps.String() |
退出进程的状态信息 |
上表中p代表: *os.Process
, ps代表: *os.ProcessState
5.2 代码示例
func TestCreateProcess(t *testing.T) { args := []string{"/"} process, err := os.StartProcess("/bin/ls", args, &os.ProcAttr{}) if err != nil { t.Error("创建新进程失败: " + err.Error()) return } fmt.Printf("当前新线程信息: %+v \n", process)
time.AfterFunc(2 * time.Second, func() { fmt.Println("发送进程退出信号...") _ = process.Signal(os.Kill) }) time.Sleep(3 * time.Second)
processState, _ := process.Wait() fmt.Printf("当前进程Id: %v \n", processState.Pid()) fmt.Printf("进程是否已退出: %v \n", processState.Exited()) fmt.Printf("进程是否成功退出: %v \n", processState.Success()) fmt.Printf("进程及子进程耗费系统CPU时间: %v \n", processState.SystemTime()) fmt.Printf("进程及子进程耗费用户CPU时间: %v \n", processState.UserTime()) fmt.Printf("进程状态: %s \n",processState.String()) }
|
输出:
=== RUN TestCreateProcess 当前新线程信息: &{Pid:46859 handle:0 isdone:0 sigMu:{w:{state:0 sema:0} writerSem:0 readerSem:0 readerCount:0 readerWait:0}} 当前进程Id: 46859 进程是否已退出: true 进程是否成功退出: true 进程及子进程耗费系统CPU时间: 1.563ms 进程及子进程耗费用户CPU时间: 503µs 发送进程退出信号... 进程状态: exit status 0 --- PASS: TestCreateProcess (3.00s) PASS
|
6. 执行命令
os/exec
包执行外部命令。它包装了os.StartProcess
函数以便更容易的修正输入和输出,使用管道连接I/O
,以及其它的一些优化。
6.1 方法列表
方法 |
功能 |
LookPath(file string) (string, error) |
在环境变量PATH 中搜索可执行文件 |
(c *Cmd) Run() error |
执行c包含的命令,并阻塞直到完成 |
(c *Cmd) Start() error |
执行c包含的命令即刻返回,但不会等待该命令完成。 |
(c *Cmd) Wait() error |
会阻塞直到该命令执行完成,和Start() 结合使用 |
(c *Cmd) Output() ([]byte, error) |
执行命令并返回标准输出的切片 |
(c *Cmd) CombinedOutput() ([]byte, error) |
执行命令并返回标准输出和错误输出合并的切片。 |
6.2 使用示例
1. LookPath
func TestLookPath(t *testing.T) { path, err := exec.LookPath("go") if err != nil { t.Error(err) } fmt.Println(path) }
|
2.Run
func TestRun(t *testing.T) { cmd := exec.Command("sleep", "3s") err := cmd.Run() if err != nil { t.Errorf("执行失败:%v\n",err) } fmt.Printf("cmd.Path: %v \n",cmd.Path) fmt.Printf("cmd.Args: %v \n",cmd.Args) }
|
3. Start
func TestStart(t *testing.T) { cmd := exec.Command("sleep", "3s") err := cmd.Start() if err != nil { t.Errorf("执行失败:%v\n",err) } err = cmd.Wait() fmt.Printf("执行完成: %v \n",err) fmt.Printf("cmd.Path: %v \n",cmd.Path) fmt.Printf("cmd.Args: %v \n",cmd.Args) }
|
4.Output
func TestOutput(t *testing.T) { output, _ := exec.Command("go", "version").Output() fmt.Printf("结果: %s \n",output) output2, _ := exec.Command("du", "-sh",".").Output() fmt.Printf("结果: %s \n",output2) }
|
5.CombinedOutput
func TestCombinedOutput(t *testing.T) { output, _ := exec.Command("go", "version-1").CombinedOutput() fmt.Printf("结果: %s \n",output) }
|