// 本进程为信号量数组的创建进程
#include
#include
#include
#include
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
int main(int argc, char *argv[])
{
int semid;
key_t key;
key = ftok("/", 'a');
// 1.创建
// int semget(key_t key, int nsems, int semflg);
// 参数:
// key 用于创建信号量数组的key值
// nsems 创建的信号两数组中信号量的个数
// semflg 与shmget类似,为信号量数组的标志位
// IPC_CREAT IPC_EXCL SIRUSR SIWUER...
// 返回值:成功,返回信号量数组的ID;失败,-1
if((semid = semget(key, 1, IPC_CREAT | 0666)) == -1)
{
perror("semget failed");
return 1;
}
printf("semid : %d\n", semid);
// 2.初始化
// int semctl(int semid, int semnum, int cmd, ...);
// 参数:
// semid 待操作的信号量数组的ID
// semnum 待操作的信号量数组中的信号两的编号(从0开始)
// cmd 执行的具体操作种类
// union semun 根据cmd取值的不同,来传递不同的参数
#if 0
union semun {
int val; /* Value for SETVAL */
struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* Array for GETALL, SETALL */
struct seminfo *__buf; /* Buffer for IPC_INFO
(Linux-specific) */
};
#endif
union semun arg;
arg.val = 1; // 指定下标信号量的初始值
semctl(semid, 0, SETVAL, arg);
// 3.wait操作(-1)
// int semop(int semid, struct sembuf *sops, unsigned nsops);
// 参数:
// semid 待操作的信号量集ID
// sops nsops 组合起来传递一个struct sembuf类型的数组,以供信号量集中的各个编号的信号量进行操作
struct sembuf s_op1;
s_op1.sem_num = 0;
s_op1.sem_op = -1;
s_op1.sem_flg = SEM_UNDO;
semop(semid, &s_op1, 1);
printf("hello shangqian!!!\n");
// 4.post操作(+1)
struct sembuf s_op2;
s_op2.sem_num = 0;
s_op2.sem_op = 1;
s_op2.sem_flg = SEM_UNDO;
semop(semid, &s_op2, 1);
printf("before destroy sem array...\n");
system("ipcs -s");
// 5.销毁
semctl(semid, 0, IPC_RMID);
printf("after destroy sem array...\n");
system("ipcs -s");
return 0;
}