[caption id="attachment_902" align="alignnone" width="300"]Golang标准库http/url Values Golang标准库[/caption] 今天我们继续os包,不多说话了就说一句是golang的os包 (1)type FileInfo里边就两个函数Stat和Lstat这个我就不多说了,使用方法相同前边咱们也介绍了

	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

(2)这个FileMode主要是判断和输出权限用的,这个没有什么多讲的所以我就直接给大家测试一下代码
	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- 	返回文件模式的字符串形式
	}

(3)func (e *LinkError) Error() string 这个函数是获取LinkError的字符串形式,首先我们看下结构
	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
	}

(4)func (e *PathError) Error() string 这个函数是获取PathError的字符串形式,然后我们看下它的结构
	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
	}

(5)type Process我们讲这个结构下的方法
	type Process struct {
	    Pid int
	}
[1]FindProcess()函数原型func FindProcess(pid int) (p *Process, err error)输入进程的pid返回的是进程的指针结构和error信息
	import (
		"fmt"
		"os"
	)

	func main() {
		p, _ := os.FindProcess(6816) //现在我本机windows下的cmd
		fmt.Println(p)               //&{6816 236 0}
	}
[2]os.StartProcess()函数原型func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)函数是新建一个进程,必须输入名称和参数还待指定环境,这是一个低级的接口,等我们讲os/exec的时候里边有更多的高级接口,返回的是进程的结构和PathError
	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}
	}

[3]func (p *Process) Kill() error 一看我们就知道是杀死进程,我们试验下
	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 还待重新来一次***
[4]func (p *Process) Release() error这个是释放进程的资源的还拿上边的做实验
	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)
		}
	}

[5]func (p *Process) Signal(sig Signal) error这个就是给一个进程发送信号用的
	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)
		}
	}

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

(6)我们讲述type ProcessState struct {}这个结构和里边的方法 [1]func (p *ProcessState) Exited() bool查看进程是否退出
	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
	}
[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使用时间
	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
	}

(7)func (e *SyscallError) Error() string 这个函数主要是获取SyscallError的字符串形式
	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
	}
***今天的os包就完了,明天我们继续讲os的子包,到时候多谢大家关注我的博客[微度网络|网络技术支持中心](http://yun.widuu.com)http://yun.widuu.com***

点赞(0) 打赏

Comment list 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部