在线咨询
有事点这里
有事点这里
看不懂这篇文章?联系我们
("麦洛克菲"长期致力于内核安全的推广与普及,我们更专业!)
求职QQ群:223902435。讨论各种求职笔试面试问题
作者:admin 时间:2015-10-31
标题:信号量

#include <stdio.h>

#include <linux/sem.h>

#define MAXNUMS 15

 

 

int get_sem_val(int sid,int semnum)//取得当前信号量

{

    return(semctl(sid,semnum,GETVAL,0));

}

 

int main(void)

{

    int sem_id;

    int pid;

    int rc;

    struct sembuf sem_op;//信号集结构

    union semun sem_val;//信号量数值

   

    

    //建立信号量集,其中只有一个信号量

    sem_id=semget(IPC_PRIVATE,1,IPC_CREAT|0600);//IPC_PRIVATE私有,只有本用户使用,如果为正整数,则为公共的;1为信号集的数量;

    if (sem_id==-1){

        printf("create sem error!\n");

        exit(1);   

    }

    printf("create %d sem success!\n",sem_id);    

    //信号量初始化

    sem_val.val=1;

    rc=semctl(sem_id,0,SETVAL,sem_val);//设置信号量,0为第一个信号量,1为第二个信号量,...以此类推;SETVAL表示设置

    if (rc==-1){

        printf("initlize sem error!\n");

        exit(1);   

    }

    //创建进程

    pid=fork();

    if (pid==-1){

        printf("fork error!\n");

        exit(1);          

    }

    else if(pid==0){//一个子进程,消费者

        for (int i=0;i<MAXNUMS;i++){

            sem_op.sem_num=0;

            sem_op.sem_op=-1;

            sem_op.sem_flg=0;

            semop(sem_id,&sem_op,1);//操作信号量,每次-1               

            printf("%d 消费者: %d\n",i,get_sem_val(sem_id,0));

        }    

    }

    else{//父进程,生产者

        for (int i=0;i<MAXNUMS;i++){

            sem_op.sem_num=0;

            sem_op.sem_op=1;

            sem_op.sem_flg=0;

            semop(sem_id,&sem_op,1);//操作信号量,每次+1                

            printf("%d 生产者: %d\n",i,get_sem_val(sem_id,0));

           

        }    

    }

    exit(0);

}