flockでデッドロック




manにかかれている内容そのままではあるけれども、先日ハマったので記録しておく。

flock() によって作られるロックは、 オープンファイル記述 (open file description) (open(2) 参照) と関連付けられる。 したがって、ファイルディスクリプターの複製 (fork(2) や dup(2) などにより作成される) は同じロックを参照し、 これらのファイルディスクリプターのどれを使っても このロックを変更したり解放したりできる。 また、ロックの解放は、 上記の複数のファイルディスクリプターのいずれかに対して 明示的に LOCK_UN 操作を指示した場合か、これらのファイルディスクリプターがすべて 閉じられた場合に行われる。

https://linuxjm.osdn.jp/html/LDP_man-pages/man2/flock.2.htmlより

要はflockでロックを掛けた場合、大抵の場合はcloseでファイルディスクリプターを閉じればロックも解放されるのだけれども、そうではない場合もあるということ。この場合、複数のプロセスで同じファイルに対するファイルディスクリプターを持っているので、/proc/locksでロックを掛けたままになっているプロセスとinode番号を確認したあと、lsofコマンドでどのプロセスがそのinode番号のファイルをオープンしているかチェックすれば、ファイルディスクリプターを閉じていないプロセスがわかるはず。


お買いものパンダのダウンローダ作った




panda

嫁がLINEで使ってたスタンプから知ったお買いものパンダ

スマホ版の壁紙は定期的に公開されているものの、PC版の壁紙はなかったので、毎日公開されている画像を取得して壁紙を作るソフトを書いてみた。

https://github.com/maruguu/okaimono_downloader

https://github.com/maruguu/mosaic_generator

有料でいいから過去に公開されていたLINEスタンプもほしいのだけれども。


Linux名前付きパイプによるC – Javaプロセス間通信




C – Javaプロセス間通信をするにはJNIやソケット通信といった方法があるけれども、Linux前提なら名前付きパイプの方がリソース的によさげなので実装方法のメモ。

送信側(C)

受信側(Java)

実行用シェルスクリプト

mkfifoでパイプを作ったらそれを読み書きするだけ