/**********************************************************
*实验要求: 创建两个进程,通过信号灯控制进程中一段代码的执行循序。
*功能描述: 本程序通过使用信号灯,实现了一种基于父子进程的简单的进程同步。
*日 期: 2010-9-17
*作 者: 国嵌
**********************************************************/
#include
#include
#include
#include
#include
#include
#include
/*
* 函数入口
* */
int main()
{
int pid,semid;
key_t semkey;
if((semkey=ftok("./sem.c",1))<0)//将文件路径和项目ID(后面那个“1“)转换为System V IPC Key
{
printf("ftok failed\n");
exit(EXIT_FAILURE);
}
printf("ftok ok, semkey=%d\n",semkey);
if((semid=semget(semkey,1,IPC_CREAT|IPC_EXCL|0700))<0)//创建信号灯集,其中包含1个信号灯
{
printf("semget failed\n");exit(EXIT_FAILURE);
}
printf("semget ok, semid=%d\n",semid);
if((semctl(semid,0,SETVAL,1))<0)//设置semid对应的信号集中第一个信号灯的semval为1。
{
printf("semctl set semval failed\n");exit(EXIT_FAILURE);
}
printf("semctl set semval ok\n");
if((pid=fork())<0)
{
printf("fork failed\n");
exit(EXIT_FAILURE);
}
else if(pid>0)//父进程,先索取共享资源,而后释放
{
struct sembuf p_op_buf,v_op_buf;
p_op_buf.sem_num=0;
p_op_buf.sem_op=-1;
if(semop(semid,&p_op_buf,1)<0)//以上三行向semid代表的信号灯集的第一个信号灯申请一个资源,即使semval减1
{
printf("semop failed\n");
exit(EXIT_FAILURE);
}
printf("father get the semaphore\n");
sleep(3);
printf("father release the semaphore\n");
v_op_buf.sem_num=0;
v_op_buf.sem_op=1;
v_op_buf.sem_flg=0;
if(semop(semid,&v_op_buf,1)<0)//以上三行将释放一个资源给semid代表的信号灯集第一个信号灯
{
printf("semop release semaphore failed\n");
exit(EXIT_FAILURE);
}
}
else//子进程不断申请共享资源,申请到后声明一下,然后释放
{
struct sembuf p_op_buf,v_op_buf;
sleep(1);//等待父进程将唯一的资源占用
printf("child wait for the semaphore\n");
p_op_buf.sem_num=0;
p_op_buf.sem_op=-1;
p_op_buf.sem_flg=0;//该标志位不用要清零,此处不清零将出现错误
if(semop(semid,&p_op_buf,1)<0)//向semid代表的信号灯集的第一个信号灯申请一个资源,申请不到就会阻塞,直到有了资源
{
printf("semop get semaphore failed\n");
exit(EXIT_FAILURE);
}
printf("child get the semaphore\n");
if(semctl(semid,0,IPC_RMID,0)<0)
{
printf("semctl remove semaphore set failed\n");
exit(EXIT_FAILURE);
}
}
}
阅读(238) | 评论(0) | 转发(0) |