int semget(key_t key, int nsems, int semflg);
//返回信号量的ID int nsems->>信号量的个数 int semfig->>若没有则创建IPC_CREAT
int semop(int semid, struct sembuf *sops, unsigned nsops);
//struct sembuf *sops 结构体指针
sops[0].sem_num = 0; 信号量标量 0
sops[0].sem_op = 0; 等待值
sops[0].sem_flg = 0; 等待阻塞
int semctl(int semid, int semnum, int cmd, ...);
int cmd, SETVAL 设置信号量的初值 ....定义一个联合体
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) */
};
demo
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
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) */
};
void pGetKey(int semid) //p操作
{
struct sembuf set;
set.sem_num=0;
set.sem_op=-1;
set.sem_flg=SEM_UNDO;
semop(semid,&set,1);
}
void vPutKey(int semid) // V操作
{
struct sembuf set;
set.sem_num=0;
set.sem_op=1;
set.sem_flg=SEM_UNDO;
semop(semid,&set,1);
}
int main()
{
key_t key;
key=ftok(".",1);
int semid=semget(key,1,IPC_CREAT|0666);
union semun initsem;
initsem.val=0;
semctl(semid,0,SETVAL,initsem);
int pid=fork();
if(pid>0){
pGetKey(semid);
printf("This is father\n");
}else if(pid==0){
vPutKey(semid);
printf("This is sun\n");
}else{
printf("creat fork\n");
}
return 0;
}
本人初学Linux写此demo也是为了以后自己好查看,后续如果有新的理解会慢慢补充,各大网友如果发现错误请留言,我积极改正