一个父子进程用信号量同步的例子,父子进程交替打印信息。 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/stat.h> #define VERIFYERR(a, b) \ if (a) { fprintf(stderr, "%s failed. \n", b); exit(1); } /* this union copy from /usr/include/bits/sem.h */ union semun { int val; struct semid_ds *buf; unsigned short int *array; struct seminfo *__buf; }; int main(void) { int i = 0, semid; pid_t pid; struct sembuf sb; union semun sem; VERIFYERR((semid = semget(1000, 2, 0666 | IPC_CREAT)) < 0, "semid"); /* initialize sem value = 1 */ sem.val = 1; VERIFYERR(semctl(semid, 0, SETVAL, sem) == -1, "semctl"); sem.val = 0; VERIFYERR(semctl(semid, 1, SETVAL, sem) == -1, "semctl"); pid = fork(); switch (pid) { case -1: perror("fork fail"); break; case 0: /* child consume */ while (i != 10) { sb.sem_num = 1; sb.sem_op = -1; sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; VERIFYERR(semop(semid, &sb, 1) != 0, "child semop"); fprintf(stderr, "child process %d\n", (int)getpid()); sb.sem_op = 1; sleep(1); sb.sem_num = 0; sb.sem_op = 1; sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; VERIFYERR(semop(semid, &sb, 1) != 0, "child semop"); ++i; } break; default:/* parent production */ while (i != 10) { sb.sem_num = 0; sb.sem_op = -1; sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; VERIFYERR(semop(semid, &sb, 1) != 0, "parent semop"); fprintf(stderr, "parent process %d\n", (int)getpid()); sb.sem_op = 1; sleep(1); sb.sem_num = 1; sb.sem_op = 1; sb.sem_flg = sb.sem_flg & ~IPC_NOWAIT; VERIFYERR(semop(semid, &sb, 1) != 0, "parent semop"); ++i; } break; } return 0; }