| | |
| | | |
| | | perms = S_IRUSR | S_IWUSR; |
| | | |
| | | semid = semget(key, 1, IPC_CREAT | IPC_EXCL | perms); |
| | | semid = semget(key, 2, IPC_CREAT | IPC_EXCL | perms); |
| | | |
| | | if (semid != -1) { /* Successfully created the semaphore */ |
| | | union semun arg; |
| | |
| | | arg.val = 0; /* So initialize it to 0 */ |
| | | if (semctl(semid, 0, SETVAL, arg) == -1) |
| | | err_exit(errno, "semctl 1"); |
| | | |
| | | arg.val = 1; |
| | | if (semctl(semid, 1, SETVAL, arg) == -1) |
| | | err_exit(errno, "semctl 2"); |
| | | //logger.info("%ld: initialized semaphore\n", (long)getpid()); |
| | | |
| | | /* Perform a "no-op" semaphore operation - changes sem_otime |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | int svsem_cond_wait(int semid ){ |
| | | |
| | | struct sembuf sops[2]; |
| | | union semun arg; |
| | | |
| | | arg.val = 1; |
| | | if (semctl(semid, 1, SETVAL, arg) == -1) { |
| | | err_msg(errno, "svsem_set"); |
| | | return errno; |
| | | } |
| | | |
| | | //释放mutex |
| | | sops[0].sem_num = 0; |
| | | sops[0].sem_op = 1; |
| | | sops[0].sem_flg = 0; |
| | | |
| | | // 等待cond |
| | | sops[1].sem_num = 1; |
| | | sops[1].sem_op = 0; |
| | | sops[1].sem_flg = 0; |
| | | |
| | | while (semop(semid, sops, 2) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "Svsvsem_dec"); |
| | | return errno; |
| | | } |
| | | |
| | | |
| | | //重新获取mutex |
| | | sops[0].sem_num = 0; |
| | | sops[0].sem_op = -1; |
| | | sops[0].sem_flg = 0; |
| | | |
| | | while (semop(semid, sops, 1) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "Svsvsem_dec"); |
| | | return errno; |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | int svsem_cond_signal(int semid ){ |
| | | union semun arg; |
| | | arg.val = 0; |
| | | |
| | | if (semctl(semid, 1, SETVAL, arg) == -1) { |
| | | err_msg(errno, "svsem_set"); |
| | | return errno; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * If sem_op equals 0, the value of the semaphore is checked to see whether it |
| | | * currently equals 0. If it does, the operation completes immediately; otherwise, |
| | |
| | | |
| | | |
| | | |
| | | |
| | | int svsem_cond_wait(int semid ){ |
| | | |
| | | struct sembuf sops[2]; |
| | | |
| | | //释放mutex |
| | | sops[0].sem_num = 0; |
| | | sops[0].sem_op = 1; |
| | | sops[0].sem_flg = 0; |
| | | |
| | | // 等待cond |
| | | sops[1].sem_num = 1; |
| | | sops[1].sem_op = -1; |
| | | sops[1].sem_flg = 0; |
| | | |
| | | while (semop(semid, sops, 2) == -1) |
| | | if (errno != EINTR) { |
| | | // err_msg(errno, "Svsvsem_dec"); |
| | | return errno; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int svsem_cond_signal(int semid ){ |
| | | struct sembuf sops; |
| | | |
| | | // 通知等待cond的进程 |
| | | sops.sem_num = 1; |
| | | sops.sem_op = 1; |
| | | sops.sem_flg = 0; |
| | | |
| | | int rv = semop(semid, &sops, 1); |
| | | if (rv == -1) { |
| | | // err_msg(errno, "Svsvsem_inc"); |
| | | return errno; |
| | | } |
| | | return 0; |
| | | } |
| | | |