Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6886
  • 博文数量: 10
  • 博客积分: 105
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-09 23:01
文章分类

全部博文(10)

文章存档

2013年(10)

我的朋友

分类: 嵌入式

2013-01-11 22:13:07

/**********************************************************
 *实验要求:   创建两个进程,通过信号灯控制进程中一段代码的执行循序。
 *功能描述:   本程序通过使用信号灯,实现了一种基于父子进程的简单的进程同步。
 *日    期:   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) |
0

上一篇:linux消息队列

下一篇:没有了

给主人留下些什么吧!~~