OSパッケージでよく使われる機能
1) ホスト名
関数定義:
func Hostname() (name string, err error)
Hostname 関数は、カーネルによって提供されたホスト名を返します。
2) 環境
関数定義:
func Environ() []string
Environ 関数はすべての環境変数を返し、戻り値は「key=value」形式の文字列のスライス コピーです。
3) ゲテンブ
関数定義:
func Getenv(key string) string
Getenv 関数は、key という名前の環境変数の値を取得して返します。環境変数が存在しない場合は空の文字列を返します。
4) セテンフ
関数定義:
func Setenv(key, value string) error
Setenv 関数は、エラーが発生した場合に返される key という名前の環境変数を設定できます。
5) 終了
関数定義:
func Exit(code int)
Exit 関数を使用すると、現在のプログラムを指定されたステータス コードで終了できます。一般に、ステータス コード 0 は成功を示し、ステータス コード 0 以外はエラーを示します。プログラムはただちに終了し、defer 関数は実行されません。
6) ゲットイド
関数定義:
func Getuid() int
Getuid 関数は呼び出し元のユーザー ID を返します。
7) ゲットギッド
関数定義:
func Getgid() int
Getgid 関数は、呼び出し元のグループ ID を返すことができます。
8) ゲットピッド
関数定義:
func Getpid() int
Getpid 関数は、呼び出し元が存在するプロセスのプロセス ID を返します。
9) ゲットウド
関数定義:
func Getwd() (dir string, err error)
Getwd 関数は、現在の作業ディレクトリに対応するルート パスを返すことができます。現在のディレクトリに複数のパス経由でアクセスできる場合 (ハード リンクのため)、Getwd はそのうちの 1 つを返します。
10) ムクディル
関数定義:
func Mkdir(name string, perm FileMode) error
Mkdir 関数は、指定されたアクセス許可と名前を持つディレクトリを作成します。エラーが発生した場合は、基礎となるタイプ *PathError のエラーが返されます。
11) MkdirAll
関数定義:
func MkdirAll(path string, perm FileMode) error
MkdirAll 関数は、必要な親ディレクトリを含む、指定された権限と名前を持つディレクトリを作成し、nil を返します。そうでない場合は、エラーが返されます。パーミッションビットパーマは、この関数によって作成されたすべてのディレクトリに適用されます。 path が既存のディレクトリを指定している場合、MkdirAll は何もせず nil を返します。
12) 削除
関数定義:
func Remove(name string) error
Remove 関数は、名前で指定されたファイルまたはディレクトリを削除します。エラーが発生した場合は、基礎となるタイプ *PathError のエラーが返されます。
RemoveAll 関数は Remove と同じですが、すべてのサブディレクトリとファイルを再帰的に削除する点が異なります。
os パッケージの下には、exec、signal、user の 3 つのサブパッケージがあります。これらについては、以下で個別に説明します。
os/exec 外部コマンドを実行する
exec パッケージは外部コマンドを実行でき、入出力の変更、パイプを使用した I/O の接続、その他の調整を容易にするために os.StartProcess 関数をラップします。
func LookPath(file string) (string, error)
環境変数 PATH で指定されたディレクトリ内で実行可能ファイルを検索します。ファイル内にスラッシュが含まれている場合は現在のディレクトリ内でのみ実行可能ファイルを検索します。フルパスまたは現在のディレクトリからの相対パスを返します。
サンプルコードは次のとおりです。
package main
import(
"fmt"
"os/exec"
)
func main() {
f、err:= exec.LookPath("main")
if err!=nil {
fmt.Println(err)
}
fmt.Println(f)
}
操作の結果は次のようになります。
main.exe
os/user 現在のユーザー情報を取得します
現在のユーザー情報は、os/user パッケージの Current() 関数を通じて取得できます。この関数は User 構造体を返し、構造体の Username、Uid、HomeDir、Gid は現在のユーザー名、ユーザー ID、それぞれディレクトリとユーザー ホーム ID、関数のプロトタイプは次のとおりです。
func Current() (*User, error)
サンプルコードは次のとおりです。
package main
import (
"log"
"OS/users"
)
func main(){
u、_:= user.Current()
log.Println("ユーザー名:", u.Username)
log.Println("ユーザーid:", u.Uid)
log.Println("ユーザーホームディレクトリ:", u.HomeDir)
log.Println("メイングループid:", u.Gid)
//ユーザーが所属するすべてのグループのid
s、_:= u.GroupIds()
log.Println("ユーザーが所属するすべてのグループ:", s)
}
正常に実行されているプログラムが終了するとき (通常の終了または Ctrl+C、kill などの強制終了)、クリーンアップ コードを実行し、仕上げ作業を完了した後に終了します。通常、システムシグナルはkill pidなどのシステムの終了を通知するために使用され、プログラム内で一部のシステムシグナルに対する処理関数が設定されており、シグナルを受信すると、関連するクリーニングプログラムを実行したり、各サブプログラムに通知したりします。 – セルフクリーニングを行うプロセス。
Go 言語の信号処理は、os/signal パッケージの主に 2 つのメソッドを使用します。1 つは受信信号を監視する Notify メソッド、もう 1 つは監視をキャンセルする stop メソッドです。
func Notify(c chan<- os.Signal, sig …os.Signal)
このうち、最初のパラメータは信号を受信するチャネルを示し、2 番目以降のパラメータは監視対象の信号を示し、未設定の場合はすべての信号を監視することを示します。
[例 1] Notify メソッドを使用して受信信号を監視します。
パッケージ main
import (
"fmt"
"os"
"os/signal"
)
func main() {
c := make(chan os.Signal, 0)
signal.Notify(c)
// シグナルを受信するまでブロックする。
s := <-c
fmt.Println("シグナルを受信しました:", s)
}
プログラムを実行し、CMD ウィンドウで Ctrl+C を押してプログラムを終了すると、次の出力が得られます。
Got signal: interrupt
【例2】stopメソッドを使用してリスニングを中止します。
package main
import (
"fmt"
"os"
"os/signal"
)
func main() {
c := make(chan os.Signal, 0)
signal.Notify(c)
signal.Stop(c) // c への内容の追加を許可しない
s := <-c // c が空のため、ここでブロッキングされるため、下記の文は実行されず、何も出力されない
fmt.Println("Got signal:", s)
}
Notify メソッドの通知は Stop メソッドでキャンセルされるため、実行中のプログラムの出力はありません。