Skip to content

Commit 28bd7ac

Browse files
authored
Merge pull request #924 from devlights/add-unix-syscall
2 parents 93d3573 + bdba6cf commit 28bd7ac

File tree

4 files changed

+78
-0
lines changed

4 files changed

+78
-0
lines changed

examples/syscall/syscall/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
app

examples/syscall/syscall/README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# これは何?
2+
3+
[unix](https://pkg.go.dev/golang.org/x/sys/unix) パッケージの
4+
5+
- Syscall()
6+
7+
を使っているサンプルです。
8+
9+
```sh
10+
$ task
11+
task: [default] rm -f ./app
12+
task: [default] go build -o app .
13+
task: [default] ./app
14+
[syscall] r1=31142, r2=0
15+
[pid ] syscall=31142, os=31142
16+
```

examples/syscall/syscall/Taskfile.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# https://taskfile.dev
2+
3+
version: '3'
4+
5+
tasks:
6+
default:
7+
cmds:
8+
- rm -f ./app
9+
- go build -o app .
10+
- ./app

examples/syscall/syscall/main.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//go:build linux
2+
3+
package main
4+
5+
import (
6+
"fmt"
7+
"log"
8+
"os"
9+
10+
"golang.org/x/sys/unix"
11+
)
12+
13+
func main() {
14+
log.SetFlags(0)
15+
if err := run(); err != nil {
16+
log.Fatal(err)
17+
}
18+
}
19+
20+
func run() error {
21+
//
22+
// unix.Syscall() のサンプル
23+
//
24+
// unix.Syscall(), unix.Syscall6() は、指定したシステムコールを呼び出すための関数。
25+
//
26+
// unix.Syscall() は引数が3つ指定できるシステムコール呼び出し関数。
27+
// これより多い場合は6つ指定できる unix.Syscall6() を利用する。
28+
//
29+
30+
//
31+
// getpid(2)
32+
// getpid(2)は引数が無い関数 (pid_t getpid(void);)
33+
//
34+
const (
35+
ZERO uintptr = 0 // unix.Syscall()で指定する際に利用する不要な引数値
36+
)
37+
var (
38+
trap uintptr = unix.SYS_GETPID
39+
r1, r2 uintptr
40+
err unix.Errno // unix.Syscall()の場合は error ではなく unix.Errno であることに注意
41+
)
42+
r1, r2, err = unix.Syscall(trap, ZERO, ZERO, ZERO)
43+
if err != 0 {
44+
return fmt.Errorf("getpid: %d", err)
45+
}
46+
47+
log.Printf("[syscall] r1=%d, r2=%d", r1, r2)
48+
log.Printf("[pid ] syscall=%d, os=%d", r1, os.Getpid())
49+
50+
return nil
51+
}

0 commit comments

Comments
 (0)