4/21 (月)
[Linux] プロセスがコアダンプ中であることを確認する手段
親プロセスは SIGCHLD シグナルを捕捉することで子プロセスの死亡を検知できるが、 SIGCHLD シグナルが送信される時期が微妙である。 プロセスがアボートしてコアダンプが走り始めた時点でソフト設計的にはそのプロセスは「死んだも同然」なのだが、 OS から見ると「まだ生きている」状態のため SIGCHLD シグナルによる通知は行われない。
メモリを大量に使用しているプロセスが異常終了した場合、 コアダンプ時間が長くなって「死んでいないけど無反応な」状態が一時的に生じる。 待っていれば状態が回復するのかもうダメなのかを判定するために、 「プロセスがコアダンプ中のかどうか?」の判定を行いたい。
Linux の場合にはプロセスがコアダンプ中かどうかは、
/proc/[number]/stat の中の flags のフィールドに
PF_DUMPCORE (0x00000200) のビットが立っているかどうかで判定できる。
PF_DUMPCORE は Linux のカーネルのヘッダーファイル(include/linux/sched.h)でしか定義されていないため、
どこかでマクロの定義が必要になる。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <assert.h>
#define PF_DUMPCORE 0x00000200 /* dumped core */
int main(int argc, char** argv) {
int child;
child = fork();
assert(child >= 0);
if (child == 0) {
// child process
// 親のチェックがし易いように優先度を下げておく
nice(1);
// (この間にメモリを消費するコードを書くとコアダンプが長くなる)
abort();
} else {
// parent process
char buffer[1024];
sprintf(buffer, "/proc/%d/stat", child);
for (;;) {
FILE* file;
if ((file = fopen(buffer, "r"))) {
unsigned long flags;
if (fscanf(file, "%*d %*s %*c %*d %*d %*d %*d %*d %lu", &flags) == 1) {
if (flags & PF_DUMPCORE) {
printf("Now core dump.");
}
}
fclose(file);
}
if (waitpid(-1, NULL, WNOHANG) > 0)
break;
}
}
return 0;
}
4/18 (金)
「ウルビーノのヴィーナス展」と「ダーウィン展」
有給休暇を消費せんと、本日はお休み。 前から行こうと思っていた国立西洋美術館でやっている「ウルビーノのヴィーナス展」と、 その隣にある国立科学博物館で開催中の「ダーウィン展」を見るために上野公園へ。
まずは西洋美術館へ。
ヴィーナス展の方はヴィーナスに関する絵画を集めた企画展だが、 展示されている絵画のかなりの部分がウフィツィ美術館(!!)から来ている。 見ごたえがある絵が多し。
西洋美術館の隣にある国立科学博物館へ。
ダーウィンの個人史を軸に進化論の成立を解説するがメイン。
ダーウィンの自筆の手紙やノート類を見ることができるのが○
ところで「進化論」の発送のヒントになったフィンチ鳥って思っていたよりも小さい鳥なのね。 もっとオウムぐらいある大きな鳥を想像していたんだけど、 トイレットペーパーの芯よりも小さい。 こんな鳥の嘴の形に違いが問題になるなんて…
4/11 (金)
業務が増えた…
年始からこちら息をつく暇がないほど忙しい日々が続いて、 この日記の更新も滞っているぐらいだが、 本日業務内容が倍増することが決定した。 トホホ。
ここ数ヶ月は土日も会社に出ていて、 思い返すと最後に休業したのは1月20日になる。 今年度の有給休暇の期限が4月20日に迫っているけど、 これから全部休んでも消化は不可能ナリ。