[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");