いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-643 (Goでsysconf(3)とpathconf(3)の呼び出し)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。

先日、以下のような記事をアップしました。

システムの設定値とか制限値を取得 (getconf, linux) - いろいろ備忘録日記

ついでなので、Goから呼び出すのに syscall とか unix パッケージとかに関数ラップされてるかなと見てみたら存在しませんでした。

なので、cgo経由で呼び出すのが最短経路みたいですね。

サンプル

main.go

//go:build unix

package main

/*
#include <stdlib.h>
#include <unistd.h>
*/
import "C"
import (
    "fmt"
    "unsafe"
)

func main() {
    if err := run(); err != nil {
        panic(err)
    }
}

func run() error {
    //
    // sysconf, pathconfは syscallやunixパッケージでも直接呼び出せるようになっていないため
    // cgoを利用して呼び出すのが楽。cgoに依存するのが嫌な場合は
    //   https://github.com/tklauser/go-sysconf
    // のようなパッケージを利用するという手もある。
    //
    v := C.sysconf(C._SC_NPROCESSORS_ONLN)
    fmt.Printf("_SC_NPROCESSORS_ONLN=%v\n", v)

    {
        ptrPath := C.CString("/")
        defer C.free(unsafe.Pointer(ptrPath))

        v = C.pathconf(ptrPath, C._PC_PATH_MAX)
        fmt.Printf("_PC_PATH_MAX=%v\n", v)

        v = C.pathconf(ptrPath, C._PC_NAME_MAX)
        fmt.Printf("_PC_NAME_MAX=%v\n", v)
    }

    return nil
}

実行

$ task
task: [default] go run main.go
_SC_NPROCESSORS_ONLN=18
_PC_PATH_MAX=4096
_PC_NAME_MAX=255

参考情報

github.com

個人的Goのおすすめ書籍

個人的に読んでとても勉強になった書籍さんたちです。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。