Linuxのreadとrecvは何が違うのか

man 2 recv [Enter]ターン The only difference between recv() and read(2) is the presence of flags. With a zero flags argument, recv() is generally equivalent to read(2) (but see NOTES). (適当な訳) recv() と read(2) の違いは flags の有無のみです。flags が 0 のとき、recv() はほとんどの場合 read(2) と等価になります。 おわり というのもアレなので Linux kernel のソースを読んでどうなっているのか見てみることにしました。 僕は Linux ニワカなので見当違いなことを言っている可能性もあるのでまあそういうつもりで読んでいただけると……。 Linux のソースコードはたまたま手元にあったやつなので超適当ですが、よく見たら 2020 年のやつでした(思ったより古かった) Linux のシステムコールは SYSCALL_DEFINEn みたいなマクロで定義するので、適当に grep します。 すると read は fs/read_write.c recv は net/compat.c にあることが分かりま

Mesonのコードを読む (1)

お久しぶりです。 どうでもいいことを気軽に書けるように(ブログサービスではなく)自分のブログを作っているのに、あんまり気軽に書けてないなと感じている今日この頃です。 で、普段からどうでもいいことを書いていないとどうでもいいことも書きづらくなってしまうな(?)と思ったわけで、質にはこだわらずにどうでもいい記事をぽんぽん出していこうと 思ったわけですね。でも書くからには何かネタがないと厳しいなというわけで、適当にそのへんの OSS のコードを読んでそれを記事にするというのをひとまず続けてみようと思っています。 コード読んで解説くらいだったらそんなに負荷も高くないので続けられそうという希望的観測もあります。 あと他人

Meson で subproject のオプションを指定する方法

備忘録。 出てこないなーとか思ってたら普通に書いてあった。 単に -D で指定するときに subproject名:オプション名 というふうに指定すればいいだけだった。 例えば subproject hoge でだけ warning_level を 3 にしたい場合は $ meson configure -Dhoge:warning_level=3 のように指定すれば ok。 ちなみにモジュール (meson.build の中で import とかして使うやつ) ごとのオプションは . で区切る。 なので pkgconfig の relocatable を true にする場合とかは -Dpkgconfig.relocatable=true とかを指定すればいい。 参考 Built-in options

FSF が送ってくるニュースレター(郵便物)を止める方法

Free Software Foundation に寄付すると毎年(?頻度は忘れた)GNU Bulletin という冊子を送ってくるようになる。 しかもアメリカから送ってくるのでこの送料も馬鹿にならないのではないだろうか…。 てことでいらないので止めてもらった。 ここ の Donations のところに メール送ったらオプトアウトできると書いてあるので、適当にメールを送る。 僕は I’d like to opt-out from print version of newsletters. My FSF username is “kofuk”. というような怪しい英語のメールを送った。 今見直すと “opt-out from” は明らかに “opt-out of” と書くべきだったとかいろいろあるが、僕は外国人なので仕方ない(適当)

Windowsのエクスプローラーでフォルダを開くたびに新しいウィンドウが開いてしまうのを直す

Windows 11 のエクスプローラーにタブ機能がついたというので、 QTTabBar を無理矢理消したら、 フォルダをひらくたびにエクスプローラーのウィンドウが増殖する問題に悩まされた。 レジストリをいじれば一発で直る。 HKEY_CLASSES_ROOT\Folder\shell にある「(既定)」というやつに値が入っていたら、それを消せばいい。 HKEY_CLASSES_ROOT というのはファイルタイプの開き方を保存しているらしい。 Windows のことはよく知らないので雰囲気で書いているが、新しいウィンドウが開いてしまうのはフォルダを開いたときに QTTabBar のルーチンが呼び出されるように設定されていることが原因のようだ。 QTTabBar はアンインストールされているので実際にはこの呼び出しは失敗するが、 そのフォールバックでエクスプローラーで開く(explo

YubiKeyのセットアップ on ArchLinux

完全にメモなので全く纏まっていないです。 インストール GUI でポチポチやりたかったので yubikey-manager-qt をインストール。 コマンドでやりたい場合は yubikey-manager を入れればいいが、なんとなくこっちの情報は少ないような気がしている。 SSH で使いたい場合は opensc パッケージもインストールする。 pcscd.socket の有効化 これを有効化しないと “Failed connecting to YubiKey” と言われてしまう。 $ sudo systemctl enable --now pcscd.socket 適当にこのエラーメッセージで調べても書いていないことが多くて、ちょっと手間取ったけど、 CLI の方で出てきたエラーで検索したらこれが出てきて、解消した。 PIN を設定したり… yubikey-manager の Applications から PIV を選ぶと PIN の設定をしたり Certificate を追加したりするオプションが出てくる。 SSH で使う ecdsa-sk、ed25519-sk といっ

CentOS 7 (rootなし) でLLVM 15をビルドする方法

入ってるパッケージが諸々古すぎるので、周辺のライブラリのビルドから始める必要がある。 そのへんを自動でやってくれるようにシェルスクリプトにまとめた。 /tmp に tmpfs がいなかったり、ホームディレクトリが NFS だったりする環境のものなので、_build_dir 系の変数は変更して使ったほうがいいと思う。 ビルド手順 まず、標準で入っている GCC は LLVM をビルドするには古すぎるので、GCC のビルドから始める必要がある。 古い LLVM から徐々にバージョンアップしていく方法でもいいが、最新の GCC はビルドできるので。ついでに GCC も最新にしてやる方が首尾が良いと思う。 で、最新の GCC をビルドするには周辺のライブラリが古すぎるので、最初にとりかかるべきは

mallocをフックしてメモリ使用量を測る

いろいろと怪しいけどこれでフックすれば取れるはず。 まあ malloc をフックしている時点で怪しいので細かいことを気にしてはいけない (?) #define _GNU_SOURCE #include <dlfcn.h> #include <string.h> #include <stdio.h> static size_t max_usage; static size_t cur_usage; static void *(*orig_malloc)(size_t); static void (*orig_free)(void *); static void *(*orig_realloc)(void *, size_t); __attribute__((constructor)) void initialize(void) { orig_malloc = dlsym(RTLD_NEXT, "malloc"); orig_free = dlsym(RTLD_NEXT, "free"); orig_realloc = dlsym(RTLD_NEXT, "realloc"); } extern char *__progname; __attribute__((destructor)) void print_stat(void) { size_t result = max_usage; fprintf(stderr, "%s: max memory usage: %zu\n", __progname, result); } void *malloc(size_t size) { void *ptr = orig_malloc(size + sizeof(size_t)); if (ptr == NULL) { return NULL; } memcpy(ptr, &size, sizeof(size_t)); cur_usage += size; if (cur_usage > max_usage) { max_usage = cur_usage; } return (void *)((unsigned char *)ptr + sizeof(size_t)); } void *calloc(size_t nmemb, size_t size) { void *ptr = malloc(nmemb * size); if (ptr != NULL) { memset(ptr, 0, size * nmemb); } return ptr; } void free(void *ptr) { if (ptr == NULL) { return; } void *head = (void *)((unsigned char *)ptr - sizeof(size_t)); size_t size; memcpy(&size, head, sizeof(size_t)); cur_usage -= size; orig_free(head); } void *realloc(void *ptr, size_t size) { size_t old_size = 0; void *result; if (ptr != NULL) { void *head = (void *)((unsigned char *)ptr - sizeof(size_t)); memcpy(&old_size, head, sizeof(size_t)); result = orig_realloc(head, size + sizeof(size_t)); } else { result = orig_realloc(ptr, size + sizeof(size_t)); } if (result != NULL) { cur_usage -= old_size; cur_usage += size; if (cur_usage > max_usage) { max_usage = cur_usage; } memcpy(result, &size, sizeof(size)); return (void *)((unsigned char *)result + sizeof(size_t)); } return NULL;

ELF ファイルを適当に編集する方法

patchelf を使うと一発。elfedit というコマンドが binutils にあるっぽかったが、使い方がイマイチ分からなかった。 RPATH の追加 $ORIGIN/../lib を追加する例。ちなみに $ORIGIN はファイルがあるディレクトリを指すので、絶対パスを使うより柔軟にパスの指定ができる。 $ patchelf --add-rpath '$ORIGIN/../lib' NEEDED の追加 $ patchelf --add-needed libhoge.so.0 RPATH と NEEDED を組み合わせると LD_PRELOAD 的なことが環境変数なしでできる 下みたいな内容で適当なライブラリを作る。 int puts(const char *s) { return 0; } で、下みたいな内容の実行ファイルに patchelf する。 #include <stdio.h> int main(void) { puts("hoge"); } $ ./hoge hoge $ patchelf --add-rpath '$ORIGIN/lib' $ patchelf --add-needed 'libhoge.so.0' $ ./hoge (何も出ない) 実用性があるかは謎。

listingsのあれこれ

LaTeX でソースコードを貼る listings についてのメモ。 毎回過去に書いた .tex ファイルを掘り返していて効率が悪かったので。 いろいろ設定 \usepackage{listings} \lstset{basicstyle=\ttfamily\footnotesize,frame=single,breaklines=true} 左側に小さく行番号を表示するような設定。 右からあふれた分は改行するようにするくらいしかやってない。 ネットの海を見に行ったらいろいろ細かく設定している人もいるので、やろうと思ったらいろいろできるのだと思う。 キャプション デフォルトだと「Listing 1 ほげほげ」みたいな名前になるので適当に変更。 \renewcommand{\lstlistingname}{リスト} これで「リスト1 ほげほげ」みたいになる。 ソースコードの埋め込み \begin{lstlisting}[caption=ほげ