linux:14信号量

1.信号量的概念

作用:同步进程
概念:相当于某个资源(硬件资源或者软件资源),特殊的变量,只能取正数值
操作:

  • p操作:减一,获取资源,阻塞
  • v操作:加一,释放资源,从不会阻塞
  • 对值的改变称为原子操作
  • 0,1二值信号量

a.c

//同步
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include "sem.h"
int main()
{
     sem_init();
     int i = 0;
     for(i=0;i<5;i++)
     {
         sem_p();
         write(1,"A",1);//第一个一代表标准输出。第二个一代表一个字符
         int n =rand()%3;
         sleep(n);//睡眠一段时间,代表对打印机的使用有一段时间
         write(1,"A",1);//使用结束
         sem_v();//释放资源
         n = rand()%3;
         sleep(n); 
     }
     sleep(10);
     sem_destroy();//销毁
     exit(0);
}

b.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include "sem.h"
int main()
{
     sem_init();
     int i = 0;
     for(i=0;i<5;i++)
     {
         sem_p();
         write(1,"B",1);//第一个一代表标准输出。第二个一代表一个字符
         int n =rand()%3;
         sleep(n);//睡眠一段时间,代表对打印机的使用有一段时间
         write(1,"B",1);//使用结束
         sem_v();//释放资源
         n = rand()%3;
         sleep(n); 
     }
     exit(0);
}

sem.h

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

union semun
{
int val;
};
void sem_init();
void sem_p();
void sem_v();
void sem_destroy();

sem.c

#include "sem.h"

static int semid = -1;

void sem_init()
{
  semid = semget((key_t)1234,1,IPC_CREAT|IPC_EXCL|0600);
  if( semid == -1)
  {
      semid = semget((key_t)1234,1,0600);
      if (semid == -1)
      {
         perror("semget error");
         return; 
      }

  }
  else
  {
     union semun a;
     a.val = 1;
     if(semctl(semid,0,SETVAL,a) == -1)
      {
          perror("semctl error");
      }
  }
  return;
}
void sem_p()
{
    struct sembuf buf;
    buf.sem_num = 0;
    buf.sem_op = -1;
    buf.sem_flg = SEM_UNDO;

    if(semop(semid,&buf,1) == -1)
    {
        perror("semop p error");
    }
}
void sem_v()
{
  
    struct sembuf buf;
    buf.sem_num = 0;
    buf.sem_op = 1;
    buf.sem_flg = SEM_UNDO;

    if(semop(semid,&buf,1) == -1)
    {
        perror("semop p error");
    }
}
void sem_destroy()
{
   if(semctl(semid,0,IPC_RMID) == -1)
   {
        perror("semctl error");
   }
}

结果:

注意:信号量创建一定要销毁。若没有销毁可以用以下方法销毁

  • 代码中:key获取semid,就可以删除
  • 命令:ipcrm -s semid

2.进程同步的概念

含义:对临界资源的访问有控制,达到同一时刻进程可以去访问。(临界资源、同步和互斥)

3.临界资源

含义:同一时刻只允许一个进程访问

4.临界区

含义:访问临界资源的代码段

更多:http://c.biancheng.net/cpp/html/2596.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值