Go的第18课——OS模块对进程的操作。

中间歇了一天主要是为ICPC做准备,看ranklist本来感觉能铜,结果打铁,麻了。。

OS模块对进程的操作

获取当前进程pid和父进程pid。

1
2
os.Getpid();
os.Getppid();

创建一个进程并为进程设置一个属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"fmt"
"os"
)

func main() {
fmt.Println(os.Getpid())
fmt.Println(os.Getppid())
attr := &os.ProcAttr{
Dir: "",
Env: os.Environ(),
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
Sys: nil,
}
pid, _ := os.StartProcess("C:\\Windows\\System32\\notepad.exe", []string{"C:\\Windows\\System32\\notepad.exe", "./1.txt"}, attr)
fmt.Printf("pid:%d\n", pid)
}

通过 pid 寻找进程:

1
os.FindProcess(pid);

返回一个进程结构。

就用上面那个例程接下来去使用。

给进程发送信号

1
p.Signal(sig)

等待进程结束

1
p.Wait()

然后写一个这样的例程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
"fmt"
"os"
"time"
)

func main() {
fmt.Println(os.Getpid())
fmt.Println(os.Getppid())
attr := &os.ProcAttr{
Dir: "",
Env: os.Environ(),
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
Sys: nil,
}
p, _ := os.StartProcess("C:\\Windows\\System32\\notepad.exe", []string{"C:\\Windows\\System32\\notepad.exe", "./1.txt"}, attr)
fmt.Printf("pid:%d\n", p)
q, _ := os.FindProcess(p.Pid)
time.AfterFunc(time.Second*1, func() { q.Signal(os.Kill) })
ps, _ := q.Wait()
fmt.Println(ps.String())
}

实现一个打开本目录下的 1.txt 文件,休眠等待一秒然后关闭。

os包和环境相关的方法

获得全部环境变量:

1
os.Environ()

获取某个环境变量

1
GOPATH := os.Getenv("GOPATH")

设置环境变量

1
os.Setenv("envname", "envvalue")

查找环境变量:

1
os.LookupEnv("key")

测试例程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main

import (
"fmt"
"os"
)

func main() {
_ = os.Environ()
GOPATH := os.Getenv("GOPATH")
fmt.Println(GOPATH)
os.Setenv("env", "env1")
key, value := os.LookupEnv("env")
fmt.Printf("%v %v\n", key, value)
}
/*
C:\Users\xia0ji233\Desktop\Home\Go\src;C:\Users\xia0ji233\Desktop\Home\Go
env1 true
*/

这里估计是自己设置了其它的 GOPATH,因为之前包的一些问题。


今天精力欠佳,明天回家多学点!!