#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/sem.h>
#include <signal.h>
int semid;
union semun {
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
void handle(int s)
{
printf("ctrl + c\n");
semctl(semid, 0, IPC_RMID);
exit(0); //这个exit是必须的,表示整个进程退出
}
main()
{
key_t key;
struct sigaction act;
sigemptyset(&act.sa_mask);
sigfillset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
act.sa_handler = handle;
sigaction(SIGINT, &act, NULL); //安装ctrl+c信号
key = ftok(".", 100); //1这个key的生成通过目录来的,很好,这种统一化的思维在大型代码里到处可见。感谢强哥!
if (key == -1) printf("ftok:%m\n"), exit(-1);
semid = semget(key, 1, IPC_CREAT|IPC_EXCL|0666); //2定义一个semid
if (semid == -1) printf("semget:%m\n"), exit(-1);
union semun v;
v.val = 2;
semctl(semid, 0, SETVAL, v); //3初始化一个semid,讲下标为0的sem设置为v
struct sembuf minusop;
minusop.sem_num = 0; //哪个sem
minusop.sem_op = -1; //操作是啥
minusop.sem_flg = 0; //默认为0,也可以是IPC_NOWAIT|SEM_UNDO(另外进程异常结束,信号量回滚到初始化状态[目的:防止死锁])
while (1) {
printf("waiting...\n");
semop(semid, &minusop, 1); //4操作这个sem
printf("go on\n");
}
semctl(semid, 0, IPC_RMID);
}
这个是semA程序。