Posix有名信号量的实现
#include <sys/types.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h> #include <semaphore.h> int main(int argc, char *argv[]) { sem_t *sem = NULL; sem = sem_open(argv[1], O_CREAT | O_RDWR, 0666, atoi(argv[2])); if(sem == SEM_FAILED) { perror("sem_open error"); exit(-1); } pid_t pid = fork(); if(pid > 0) { int i; for(i = 0; i < 10; i++) { sem_wait(sem); printf("parent: pid = %ld, ppid=%ld, i= %d\n", (long)getpid(), (long)getppid(), i); sleep(1); sem_post(sem); sem_post(sem); sleep(1); } waitpid(pid, NULL, 0); sem_close(sem); sem_unlink(argv[1]); exit(0); } else { int i, val = -1; for(i = 0; i < 4; i++) { sem_wait(sem); sem_getvalue(sem, &val); printf("child: pid = %ld, ppid=%ld, i= %d, val= %d\n", (long)getpid(), (long)getppid(), i, val); sleep(2); sem_post(sem); sleep(1); } sem_close(sem); } }
运行如下:
$ ./t03_sem /sem_03 1 parent: pid = 4346, ppid=2057, i= 0 child: pid = 4347, ppid=4346, i= 0, val= 1 parent: pid = 4346, ppid=2057, i= 1 child: pid = 4347, ppid=4346, i= 1, val= 2 parent: pid = 4346, ppid=2057, i= 2 parent: pid = 4346, ppid=2057, i= 3 child: pid = 4347, ppid=4346, i= 2, val= 2 parent: pid = 4346, ppid=2057, i= 4 child: pid = 4347, ppid=4346, i= 3, val= 5 parent: pid = 4346, ppid=2057, i= 5 parent: pid = 4346, ppid=2057, i= 6 parent: pid = 4346, ppid=2057, i= 7 parent: pid = 4346, ppid=2057, i= 8 parent: pid = 4346, ppid=2057, i= 9
一干解千愁

浙公网安备 33010602011771号