• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Go语言os包用法简述

开发技术 开发技术 2周前 (04-07) 5次浏览

os标准包,是一个比较重要的包,顾名思义,主要是在服务器上进行系统的基本操作,如文件操作,目录操作,执行命令,信号与中断,进程,系统状态等等。在os包下,有exec,signal,user三个子包。

启动外部命令和程序

在os包中,有很多有趣的功能,比如可以通过变量Args来获取命令参数,os.Args返回一个字符串数组。

fmt.Println(os.Args)

在os包中,相关函数名字和作用有较重的Unix风,比如:

funcChdir(dirstring)error//chdir将当前工作目录更改为dir目录
funcGetwd()(dirstring,errerror)//获取当前目录
funcChmod(namestring,modeFileMode)error//更改文件的权限
funcChown(namestring,uid,gidint)error//更改文件拥有者owner
funcChtimes(namestring,atimetime.Time,mtimetime.Time)errorfuncClearenv()//清除所有环境变量(慎用)
funcEnviron()[]string//返回所有环境变量
funcExit(codeint)//系统退出,并返回code,其中0表示执行成功并退出,非0表示错误并退出

在os包中,有关文件的处理也有很多方法,如:

funcCreate(namestring)(fileFile,errerror)//Create采用模式0666创建一个名为name的文件,如果文件已存在会截断它(为空文件)
funcOpen(namestring)(fileFile,errerror)//Open打开一个文件用于读取。
func(fFile)Stat()(fiFileInfo,errerror)//Stat返回描述文件f的FileInfo类型值
func(fFile)Readdir(nint)(fi[]FileInfo,errerror)//Readdir读取目录f的内容,返回一个有n个成员的[]FileInfo
func(fFile)Read(b[]byte)(nint,errerror)//Read方法从f中读取最多len(b)字节数据并写入b
func(fFile)WriteString(sstring)(retint,errerror)//向文件中写入字符串
func(fFile)Sync()(errerror)//Sync递交文件的当前内容进行稳定的存储。
func(fFile)Close()error//Close关闭文件f

在os包中有一个StartProcess函数可以调用或启动外部系统命令和二进制可执行文件;它的第一个参数是要运行的进程,第二个参数用来传递选项或参数,第三个参数是含有系统环境基本信息的结构体。

这个函数返回被启动进程的id(pid),或者启动失败返回错误。

packagemainimport("fmt""os")funcmain(){//1)os.StartProcess///*********************//*Linux:*/env:=os.Environ()procAttr:=&os.ProcAttr{Env:env,Files:[]*os.File{os.Stdin,os.Stdout,os.Stderr,},}//1stexample:listfilesPid,err:=os.StartProcess("/bin/ls",[]string{"ls","-l"},procAttr)iferr!=nil{fmt.Printf("Error%vstartingprocess!",err)//os.Exit(1)}fmt.Printf("Theprocessidis%v",pid)}
os/signal信号处理

一个运行良好的程序在退出(正常退出或者强制退出,如ctrl+c,kill等)时是可以执行一段清理代码,将收尾工作做完后再真正退出。一般采用系统Signal来通知系统退出,如killpid。在程序中针对一些系统信号设置了处理函数,当收到信号后,会执行相关清理程序或通知各个子进程做自清理。

Go语言的系统信号处理主要涉及os包、os.signal包以及syscall包。其中最主要的函数是signal包中的Notify函数: 

1 funcNotify(cchan<-os.Signal,sig…os.Signal) 

该函数会将进程收到的系统Signal转发给channelc。如果没有传入sig参数,那么Notify会将系统收到的所有信号转发给channelc。

Notify会根据传入的os.Signal,监听对应Signal信号,Notify()方法会将接收到对应os.Signal往一个channelc中发送。

下面代码以syscall.SIGUSR2信息为例,说明了具体实现:

package main 
import("fmt""os""os/signal""syscall""time")
func main(){gosignalListen()for{time.Sleep(10*time.Second)}}
func signalListen(){
c:=make(chanos.Signal)signal.Notify(c,syscall.SIGUSR2)
for{s:=<-c//收到信号后的处理,这里只是输出信号内容,可以做一些更有意思的事fmt.Println("getsignal:",s)}
}
Tags:Go

 


程序员灯塔
转载请注明原文链接:Go语言os包用法简述
喜欢 (0)