参考http://blog.csdn.net/ljianhui/article/details/10243617
在学习信号量时,我们要理顺linux提供两种信号量
下面主要针对SYSTEM V举例
功能:父子进程间通过两个信号量实现同步。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define PATHNAME /home/smb/test/2-4-1/test.c
#define SEM_NUM 2
union semun
{
int val;
struct semid_ds *buf;
unsigned short *arry;
};
//sem:信号标示符,index:信号灯编号, value:信号初始值
int set_semval(int sem, int index, int value)
{
union semun sem_union;
sem_union.val = value;
if(semctl(sem, index,SETVAL,sem_union) == -1)
{
return 0;
}
return 1;
}
//sem:信号标示符,sops:带操作信号数组, index:信号灯编号
int sem_p(int sem, struct sembuf *sops, int index)
{
sops->sem_num = index;
sops->sem_op = -1;
sops->sem_flg=SEM_UNDO;
if(semop(sem, sops, 1) == -1)
{
return 0;
}
return -1;
}
int sem_v(int sem, struct sembuf *sops, int index)
{
sops->sem_num = index;
sops->sem_op = 1;
sops->sem_flg=SEM_UNDO;
if(semop(sem, sops, 1) == -1)
{
return 0;
}
return -1;
}
int main(void)
{
key_t key;
int err;
int sem_id;
int i;
int pid;
struct sembuf sops[2];
key = ftok("PATHNAME",'a');
printf("key=%d\n",key);
sem_id = semget(key,2,IPC_CREAT|0777);
if(sem_id == -1)
{
printf("semget fail\n");
exit(EXIT_FAILURE);
}
/*初始化信号集*/
for(i=0;i<SEM_NUM;i++)
{
err = set_semval(sem_id, i, 1);
if(!err)
{
printf("sem_set_val fail:i=%d\n",i);
exit(EXIT_FAILURE);
}
}
if( (pid=fork()) <0)
{
printf("fork fail\n");
exit(EXIT_FAILURE);
}
if(pid>0)
{
/*等待信号量sem_1*/
err = sem_p(sem_id, &sops[0], 0);
if(!err)
{
printf("sem_p fail:i=%d\n",0);
exit(EXIT_FAILURE);
}
printf("father get sem_1\n");
/*释放信号量sem_1*/
err = sem_v(sem_id, &sops[0], 0);
if(!err)
{
printf("sem_v fail:i=%d\n",0);
exit(EXIT_FAILURE);
}
printf("father release sem_1\n");
sleep(5);
/*等待信号量sem_2*/
err = sem_p(sem_id, &sops[1], 1);
if(!err)
{
printf("sem_p fail:i=%d\n",1);
exit(EXIT_FAILURE);
}
printf("father get sem_2\n");
}
else
{
sleep(2);
/*等待信号量sem_1*/
err = sem_p(sem_id, &sops[0], 0);
if(!err)
{
printf("sem_p fail:i=%d\n",0);
exit(EXIT_FAILURE);
}
printf("child get sem_1\n");
/*等待信号量sem_2*/
err = sem_p(sem_id, &sops[1], 1);
if(!err)
{
printf("sem_p fail:i=%d\n",1);
exit(EXIT_FAILURE);
}
printf("child get sem_2\n");
/*释放信号量sem_2*/
err = sem_v(sem_id, &sops[1], 1);
if(!err)
{
printf("sem_p fail:i=%d\n",1);
exit(EXIT_FAILURE);
}
printf("child release sem_2\n");
}
}
运行结果: