特に作りたいものがないので陳腐化しない技術ということでシステムコール勉強してる。勉強してるうちに作りたいものができるか、そうでなければ将来困ったときに勉強したことでできたインデックスに引っかかり作ろうというモチベーションになることを期待してる。
システムコールの前にプロセスが曖昧だったのでなるほどUnixプロセスよんだ。
deamon とか prefork とか普段使ってるのでだいたいわかってるつもりだけど一応復習も兼ねて。どっちかって言うと nginx とかのイベント駆動の方が分かってない。イベントループがあってコールバックがあってくらいはわかる。AnyEventは使ったことない。まぁ今回の話とは関係ない。
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
- 作者: 青木峰郎
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2005/07/27
- メディア: 単行本
- 購入: 35人 クリック: 450回
- この商品を含むブログ (150件) を見る
次にふつうのLinuxプログラミング読んだ。ファイルシステムとかストリームとか基本から載っててよかった。
その後は
読んだ。システムコールをある程度理解した上で読むと 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) } }
たった 34 行しかないし、 curl http://localhost:8888
したら
GET / HTTP/1.1 Host: localhost:8888 User-Agent: curl/7.43.0 Accept: */*
が表示されるだけだけだし、レスポンスは返ってこないけど、学びはあったという印象。
次何勉強するか
- コンテナ作る
- https://github.com/golang/go/issues/227 の話題が理解できないので周辺知識を埋める