初心者のGo言語 -18- <Getpagesize,Getpid,Getppid,Getuid,Getwd,Hostname>
こんにちは、kurumi-bioです。 第5回目のosパッケージ(標準ライブラリー)の学習です。
環境
Windows
OSバージョン:Windows11 Home 22H2
Go言語のバージョン:go version go1.19.4 windows/amd64Linux
OSバージョン:openSUSE Leap 15.4
Go言語のバージョン:go version go1.20.1 linux/amd64
Getpagesize関数
func Getpagesize() int
Getpagesize は、基になるシステムのメモリ ページ サイズを返します。
<サンプルコード>GetpagesizeSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getpagesize()) }
<実行結果>
上がWindowsで下がLinuxの実行結果です。 両OSともにページサイズは4Kbという結果になりました。
Getpid関数
func Getpid() int
Getpid は、呼び出し元のプロセス ID を返します。
<サンプルコード>GetpidSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getpid()) }
<実行結果>
実行するとプロセスIDが表示されました。
このプログラムですと一瞬で終わってしまうので正しい値か確認できません。
プログラムにtime.Sleep関数を追加して処理を1分間終わらせないようにしました。
<サンプルコード>GetpidSampleK1.go
package main import ( "fmt" "os" "time" ) func main() { fmt.Println(os.Getpid()) time.Sleep(time.Minute * 1) }
<実行結果>
タスクマネージャの詳細画面を見ると、
プロセスID 8424のプロセスは、GetpidSampleK1.exeとなっています。
go run
コマンドは、ビルドしてEXEにしてから実行していることがわかります。
Getppid関数
func Getppid() int
Getppid は、呼び出し元の親のプロセス ID を返します
<サンプルコード>GetppidSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getppid()) }
<実行結果>
2回実行しましたが、2回とも別のプロセスIDが表示されました。
ひとつ前でgo run
コマンドを実行すると「ビルドして実行」となっていることが判明しました。
ですので、表示されている親プロセスIDは、「ビルドして実行」のプロセスIDだと思われます。
では、試しにtime.Sleep関数を追加して実行してみます。
<サンプルコード>GetppidSampleK1.go
package main import ( "fmt" "os" "time" ) func main() { fmt.Println(os.Getpid()) fmt.Println(os.Getppid()) time.Sleep(time.Minute * 1) }
<実行結果>
親プロセスは、go.exeでした。go run
を実行しているの当然なのですが、
ビルドしたモジュールが終わるのを待っているのが意外でした。
ちなみに、ビルドしてexe形式にしてから実行すると、親プロセスがコマンドプロンプトになるので、 何度実行しても親プロセスIDは同じになります。
<広告の下に記事が続きます。>
Getuid関数
func Getuid() int
Getuid は、呼び出し元の数値ユーザー ID を返します。 Windows では -1 を返します。
<サンプルコード>GetuidSample.go
package main import ( "fmt" "os" ) func main() { fmt.Println(os.Getuid()) }
<実行結果>
上がWindowsで下がLinuxの実行結果です。 Linuxは、ユーザIDが取得できています。
Getwd関数
func Getwd() (dir string, err error)
Getwd は、現在のディレクトリに対応するルート パス名を返します。 (シンボリック リンクにより) 複数のパスを介して現在のディレクトリに到達できる場合、Getwd はそれらのいずれかを返す場合があります。
<サンプルコード>GetwdSample.go
package main import ( "fmt" "os" ) func main() { s, e := os.Getwd() if e != nil { fmt.Fprintf(os.Stderr, "os.Getwd Error: %v \n", e) os.Exit(1) } fmt.Println(s) }
<実行結果>
パス名が取得できました。
Hostname関数
func Hostname() (name string, err error)
Hostname は、カーネルによって報告されたホスト名を返します。
<サンプルコード>HostnameSample.go
package main import ( "fmt" "os" ) func main() { s, e := os.Hostname() if e != nil { fmt.Fprintf(os.Stderr, "os.Hostname Error: %v \n", e) os.Exit(1) } fmt.Println(s) }
<実行結果>
ホスト名が取得できました。
最後までご覧いただきありがとうございます