写了一个demo,用来测试信号量,在终端起两个demo, 分别可以操作V,P,查看各进程的工作状态
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
const char * FILEPATH = "/tmp";
int semid;
// -1
int semop_P() {
printf("semop_P\n");
struct sembuf sops;
sops.sem_num = 0; /* Operate on semaphore 0 */
sops.sem_op = -1; /* Wait for value to equal 0 */
sops.sem_flg = SEM_UNDO;
if (semop(semid, &sops, 1) == -1) {
perror("semop");
return 0;
}
return 1;
}
// 删除信号量
int del_sem() {
printf("del_sem\n");
union semun sem_union;
if (semctl(semid, 0, IPC_RMID, sem_union) == -1)
{
fprintf(stderr, "Failed to delete semaphore\n");
return 0;
}
return 1;
}
// +1
int semop_V() {
printf("semop_V\n");
struct sembuf sops;
sops.sem_num = 0; /* Operate on semaphore 0 */
sops.sem_op = 1; /* Wait for value to equal 1 */
sops.sem_flg = SEM_UNDO;
if (semop(semid, &sops, 1) == -1) {
perror("semop");
return 0;
}
return 1;
}
int create_sem() {
printf("create_sem\n");
int flags, opt;
key_t key;
flags = 0;
flags |= IPC_CREAT;
key = ftok(FILEPATH, 1);
if (key == -1) {
perror("ftok");
exit(EXIT_FAILURE);
}
semid = semget(key, 1, flags | 0666);
if (semid == -1) {
perror("semget");
return 0;
}
// 用于初始化信号量,在使用信号量前必须这样做
union semun sem_union;
sem_union.val = 1;
if (semctl(semid, 0, SETVAL, sem_union) == -1)
{
return 0;
}
return 1;
}
int show_sem() {
printf("show_sem :%d\n", semctl(semid, 0, GETVAL, 0));
return 1;
}
int main(int argc, char *argv[])
{
while(1) {
char c = getchar();
switch (c) {
case 'c':
printf("create_sem = %d\n", create_sem());
break;
case 'p':
printf("semop_P = %d\n", semop_P());
break;
case 'v':
printf("semop_V = %d\n", semop_V());
break;
case 's':
show_sem();
break;
case 'q':
printf("del_sem = %d", del_sem());
printf("quit\n");
exit(EXIT_SUCCESS);
break;
case '\n':
break;
default:
printf("invalid options : %c\n", c);
break;
}
}
}
编译&&运行
gcc ./test_semop.cpp -o test_semop