golang讲解(go语言)标准库分析之os(8)

widuu · · 2058 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Golang标准库http/url Values

Golang标准库


今天我们继续os包,不多说话了就说一句是golang的os包

(1)type FileInfo里边就两个函数Stat和Lstat这个我就不多说了,使用方法相同前边咱们也介绍了
[php]
import (
"fmt"
"os"
)

func main() {
//这个和stat差不多
f, _ := os.Lstat("1.go")
fmt.Println(f) // &{1.go {32 {2883792444 30345044} {2884358853 30345044} {3464863792 30345293} 0 43} {0 0} D:\test\1.go 0 0 0}
}

type FileMode
func (m FileMode) IsDir() bool
func (m FileMode) IsRegular() bool
func (m FileMode) Perm() FileMode
func (m FileMode) String() string

[/php]

(2)这个FileMode主要是判断和输出权限用的,这个没有什么多讲的所以我就直接给大家测试一下代码

[php]
import (
"fmt"
"os"
"reflect"
)

func main() {
f, _ := os.Stat("1.go")
fi := f.Mode()
fmt.Println(reflect.TypeOf(fi)) //os.FileMode
fmt.Println(fi.IsDir()) //false 判断是否是目录
fmt.Println(fi.IsRegular()) //true 判断是否是个常规文件
fmt.Println(fi.Perm()) //-rw-rw-rw- 返回的unix浅显
fmt.Println(fi.String()) //-rw-rw-rw- 返回文件模式的字符串形式
}

[/php]

(3)func (e *LinkError) Error() string 这个函数是获取LinkError的字符串形式,首先我们看下结构

[php]
type LinkError struct {
Op string
Old string
New string
Err error
}

import (
"errors"
"fmt"
"os"
)

func main() {
linkerror := &os.LinkError{
Op: "widuu",
Old: "old",
New: "new error",
Err: errors.New("error test"),
}
fmt.Println(linkerror.Error()) //widuu old new error: error test
}

[/php]

(4)func (e *PathError) Error() string 这个函数是获取PathError的字符串形式,然后我们看下它的结构

[php]
type PathError struct {
Op string
Path string
Err error
}
import (
"errors"
"fmt"
"os"
)

func main() {
patherr := &os.PathError{
Op: "dir",
Path: "widuu",
Err: errors.New("no path"),
}
fmt.Println(patherr.Error()) //dir widuu: no path
}

[/php]

(5)type Process我们讲这个结构下的方法

[php]
type Process struct {
Pid int
}
[/php]

[1]FindProcess()函数原型func FindProcess(pid int) (p *Process, err error)输入进程的pid返回的是进程的指针结构和error信息

[php]
import (
"fmt"
"os"
)

func main() {
p, _ := os.FindProcess(6816) //现在我本机windows下的cmd
fmt.Println(p) //&{6816 236 0}
}
[/php]

[2]os.StartProcess()函数原型func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)函数是新建一个进程,必须输入名称和参数还待指定环境,这是一个低级的接口,等我们讲os/exec的时候里边有更多的高级接口,返回的是进程的结构和PathError

[php]
import (
"fmt"
"os"
)

func main() {
attr := &os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}, //这里注意哈
}
p, err := os.StartProcess(`c:\windows\system32\notepad.EXE`, []string{`c:\windows\system32\notepad.EXE`, `d:/1.txt`}, attr) //windows打开文件夹下1.txt
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(p) //&{5488 240 0}
}

[/php]

[3]func (p *Process) Kill() error 一看我们就知道是杀死进程,我们试验下

[php]
import (
"fmt"
"os"
)

func main() {
p, _ := os.FindProcess(7588) //现在我本机windows下的cmd
fmt.Println(p) // &{7588 224 0}
err := p.Kill()
if err != nil {
fmt.Println(err)
}
fmt.Println("杀死进程")
}

***很郁闷的事情是~~~我正用着这个进程godoc -http:=8080 还待重新来一次***
[/php]

[4]func (p *Process) Release() error这个是释放进程的资源的还拿上边的做实验

[php]
import (
"fmt"
"os"
)

func main() {
attr := &os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
}
p, err := os.StartProcess(`c:\windows\system32\notepad.EXE`, []string{`c:\windows\system32\notepad.EXE`, `d:/1.txt`}, attr) //windows打开文件夹下1.txt
if err != nil {
fmt.Println(err.Error()) // &{7704 244 0}
}
fmt.Println(p)
if err := p.Release(); err != nil {
fmt.Printf("Error: %v\n", err)
}
}

[/php]

[5]func (p *Process) Signal(sig Signal) error这个就是给一个进程发送信号用的

[php]
import (
"fmt"
"os"
)

func main() {
attr := &os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
}
p, _ := os.StartProcess(`c:\windows\system32\notepad.EXE`, []string{`c:\windows\system32\notepad.EXE`, `d:/1.txt`}, attr)
fmt.Println(p)
if err := p.Signal(os.Kill); err != nil { //向系统发送一个干掉他的信号 所以我们熟悉的记事本不出来了
fmt.Println(err)
}
}

[/php]

[6]func (p *Process) Wait() (*ProcessState, error) 一看就知道了,这个函数是等待函数的进程完成,然后返回进程结构体指针的了

[php]
import (
"fmt"
"os"
)

func main() {
attr := &os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
}
p, _ := os.StartProcess(`c:\windows\system32\notepad.EXE`, []string{`c:\windows\system32\notepad.EXE`, `d:/1.txt`}, attr)
pw, _ := p.Wait()
fmt.Println(pw) //exit status 0
}

[/php]

(6)我们讲述type ProcessState struct {}这个结构和里边的方法

[1]func (p *ProcessState) Exited() bool查看进程是否退出

[php]
import (
"fmt"
"os"
)

func main() {
attr := &os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
}
p, _ := os.StartProcess(`c:\windows\system32\notepad.EXE`, []string{`c:\windows\system32\notepad.EXE`, `d:/1.txt`}, attr)
fmt.Println(p) //&{7764 252 0}
pw, _ := p.Wait()
fmt.Println(pw.Exited()) //当我关闭记事本的时候进程结束,所以就算true
}
[/php]

[2]func (p *ProcessState) Pid() int 很简单返回进程的pid,剩下的我就不一一说了直接说明了然后做实验

[3]func (p *ProcessState) String() string 这个函数主要是获取进程状态的字符串

[4]func (p *ProcessState) Success() bool 这个函数报告是否退出

[5]func (p *ProcessState) Sys() interface{} 这个函数主要是获取进程的退出信息

[6]func (p *ProcessState) SysUsage() interface{} 这个函数主要是获取进程资源使用情况

[7]func (p *ProcessState) SystemTime() time.Duration 这个函数主要是获取的进程的系统cpu使用时间

[8]func (p *ProcessState) UserTime() time.Duration 这个函数主要是获取的进程的用户cpu使用时间

[php]
import (
"fmt"
"os"
)

func main() {
attr := &os.ProcAttr{
Files: []*os.File{os.Stdin, os.Stdout, os.Stderr},
}
p, _ := os.StartProcess(`c:\windows\system32\notepad.EXE`, []string{`c:\windows\system32\notepad.EXE`, `d:/1.txt`}, attr)
fmt.Println(p) //&{44 252 0}
pw, _ := p.Wait()
fmt.Println(pw.Pid()) //44
fmt.Println(pw.String()) //exit status 0
fmt.Println(pw.Success()) //true
fmt.Println(pw.Sys()) //{0}
fmt.Println(pw.SysUsage()) //&{{1728533532 30345488} {1745163891 30345488} {1562500 0} {1562500 0}}
fmt.Println(pw.SystemTime())//156.25ms
fmt.Println(pw.UserTime()) //156.25ms
}

[/php]

(7)func (e *SyscallError) Error() string 这个函数主要是获取SyscallError的字符串形式

[php]
type SyscallError struct {
Syscall string
Err error
}
import (
"errors"
"fmt"
"os"
)

func main() {
err := &os.SyscallError{
Syscall: "widuu",
Err: errors.New("syscall error"),
}
fmt.Println(err.Error()) //widuu: syscall error
}
[/php]

***今天的os包就完了,明天我们继续讲os的子包,到时候多谢大家关注我的博客[微度网络|网络技术支持中心](http://www.widuu.com)http://www.widuu.com***

未经允许,不得转载本站任何文章:微度网络 » golang讲解(go语言)标准库分析之os(8)


有疑问加站长微信联系(非本文作者)

本文来自:微度网络

感谢作者:widuu

查看原文:golang讲解(go语言)标准库分析之os(8)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2058 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传