AIX上でのセマフォを使った排他処理
Windows上でMutexを使った排他処理を作成したが、AIX上ではセマフォを使ってみた。#include<sys/types.h>#include<sys/ipc.h>#include<sys/sem.h>#include<errno.h>#define SEM_NO 0x67890123int main(int argc, char **argv) { int semid; struct sembuf sembuf; semid = semget(SEM_NO, 1, IPC_CREAT | IPC_EXCL | 0666); if(semid < 0) { printf("error.(%d)\n", errno); semid = semget(SEM_NO, 1, IPC_CREAT | 0666); } else { if(semctl(semid, 0, SETVAL, 1)) { printf("semctl error.(%d)\n", errno); semctl(semid, 0, IPC_RMID); return -1; } } sembuf.sem_num = 0; sembuf.sem_op = -1; sembuf.sem_flg = SEM_UNDO; if(semop(semid, &sembuf, 1) < 0) { printf("semop(1) error.(%d)\n", errno); return -1; } printf("semop(1).\n"); getchar(); sembuf.sem_num = 0; sembuf.sem_op = 1; sembuf.sem_flg = SEM_UNDO; if(semop(semid, &sembuf, 1) < 0) { printf("semop(2) error.(%d)\n", errno); return -1; } printf("semop(2).\n"); /* semctl(semid, 0, IPC_RMID); */ return 0;}semgetが2つあるのは、すでに存在している場合は初期化を行わないようにするために最初のsemgetでエラーとなるように、IPC_EXCLを指定しているからです。また、IPC_RMIDによる削除はしないようにしているのは、複数プロセスにて排他処理するためです。削除するには、ipcrm -sにて行います。