[unix系] SEM_UNDO
仕事絡みで
A. あるプロセスがセマフォを取得したまま終了するとセマフォは取得されたまま
B. あるプロセスがセマフォを取得したまま終了するとセマフォは返却される
という二つの意見を聞き、確認してみた。
デフォルトだと、A(取得されっぱなし)だが、semop()呼ぶときのsem_flgにSEM_UNDOをセットしておくと、B(プロセス終了時にカーネルがセマフォを調整)らしい(by 詳解UNIXプログラミング)。なるほどぉ。
実験結果もその通りでした。ついでに後で再利用できるよう実験ソースの一部を。
printf("parent is getting semapho.\n"); sembuffer.sem_num = 0; sembuffer.sem_op = -1; #ifdef NO_UNDO sembuffer.sem_flg = 0; #else sembuffer.sem_flg = SEM_UNDO; #endif semop(semid, &sembuffer, 1); printf("parent has gotten semapho.\n"); sembuffer.sem_num = 0; sembuffer.sem_op = 1; #ifdef NO_UNDO sembuffer.sem_flg = 0; #else sembuffer.sem_flg = SEM_UNDO; #endif semop(semid, &sembuffer, 1); printf("parent has released semapho.\n");