特に作りたいものがないので陳腐化しない技術ということでシステムコール勉強してる。勉強してるうちに作りたいものができるか、そうでなければ将来困ったときに勉強したことでできたインデックスに引っかかり作ろうというモチベーションになることを期待してる。
システムコールの前にプロセスが曖昧だったのでなるほどUnixプロセスよんだ。
tatsu-zine.com
deamon とか prefork とか普段使ってるのでだいたいわかってるつもりだけど一応復習も兼ねて。どっちかって言うと nginx とかのイベント駆動の方が分かってない。イベントループがあってコールバックがあってくらいはわかる。AnyEventは使ったことない。まぁ今回の話とは関係ない。
次にふつうのLinuxプログラミング読んだ。ファイルシステムとかストリームとか基本から載っててよかった。
その後は
ascii.jp
読んだ。システムコールをある程度理解した上で読むと Go の Interface は良く出来てるなぁと感じた。
とりあえず、何書かないとすぐにわすれるんだろうなぁと思いhttp server書こうと思ったけどストリームをパースするところで飽きてやめた。これを機に RFC 読むのも良かったかもしれない。けど、とにかくモチベーションがなくなった。
package main
import (
"fmt"
"os"
"syscall"
)
func main() {
fmt.Println(os.Getpid())
fd, _ := syscall.Socket(syscall.AF_INET, syscall.SOCK_STREAM, 0)
sa := syscall.SockaddrInet4{Port: 8888}
if err := syscall.Bind(fd, &sa); err != nil {
fmt.Println(err)
}
if err := syscall.Listen(fd, 5); err != nil {
fmt.Println(err)
}
for {
nfd, _, err := syscall.Accept(fd)
if err != nil {
fmt.Println(err)
}
buffer := make([]byte, 1024)
syscall.Read(nfd, buffer)
fmt.Println(string(buffer))
syscall.Close(nfd)
}
}
github.com
たった 34 行しかないし、 curl http://localhost:8888
したら
GET / HTTP/1.1
Host: localhost:8888
User-Agent: curl/7.43.0
Accept: */*
が表示されるだけだけだし、レスポンスは返ってこないけど、学びはあったという印象。
次何勉強するか