linux下信号量的使用

原创 2015年11月21日 10:44:43

信号量是为了防止在多个程序同时访问一个共享资源发生问题的情况下引入的。

在两个进程中对信号量控制的伪代码都是下面这样的

semaphore sv = 1;


loop forever{

p(sv);

critical code section;

v(sv);

noncritical code section;

}




下面来学习一个信号量使用的例子,在任何时候都只有一个进程可以进入临界区域

具体代码如下:

#include <iostream>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/sem.h>
using namespace std;

union semun{
    int value;
    struct semid_ds *buf;
    unsigned short* array;

};

//定义的接口  和初始的信号量ID
static int set_semvalue(void);
static void del_semvalue(void);
static int semaphore_p(void);
static int semaphore_v(void);
static int sem_id;

int main(int argc , char* argv[])
{

    int i;
    int pause_time;
    char op_char = '0';

    srand((unsigned int)getpid());

    sem_id = semget((key_t)1234  , 1 , 0666| IPC_CREAT);

    if(argc > 1){
        if(!set_semvalue()){
            fprintf(stderr , "Failed to initialized semaphored!\n");
            exit(EXIT_FAILURE);
        }


        op_char = 'X';
        sleep(2);
    }

    //接下来是一个循环,进入和离开临界区10次。在每次循环的开始,首先调用semphore_p,它在程序进入临界区的时候设置信号量等级进入、
    for(int i =  0 ; i < 10 ; i++){
        if(!semaphore_p()) exit(EXIT_FAILURE);
        printf("%c" , op_char);
        fflush(stdout);
        pause_time = rand() % 3;
        sleep(pause_time);
        printf("%c" , op_char); fflush(stdout);

        //在临界区域后,调用semaphore_v将信号量设置为可用。然后等待一段随机的时间,再进下一次循环。在整个循环完成后,调用del_semaphore来清理代码
        if(!semaphore_v())exit(EXIT_FAILURE);

        pause_time = rand() % 2;
        sleep(pause_time);

    }


    printf("\n %d - finished\n" , getpid());

    if(argc > 1){
        sleep(10);
        del_semvalue();
    }

    exit(EXIT_SUCCESS);

    //return 0;
}


static int set_semvalue(void){
//函数通过将semctl调用的commang参数设置为SETVAL来初始化信号量。在使用前必须要这样做
    union semun sem_union;
    sem_union.value = 1;
    if(semctl(sem_id ,0, SETVAL , sem_union) == -1) return (0);
    return (1);

}
static void del_semvalue(void){
//删除信号量ID

union semun sem_union;
if(semctl(sem_id ,0, IPC_RMID , sem_union) == -1)
    fprintf(stderr , "Failed to delete semaphore\n");
}
static int semaphore_p(void){
//对信号量做减1的操作


struct sembuf sem_b;

sem_b.sem_num = 0;
sem_b.sem_op= -1;
sem_b.sem_flg = SEM_UNDO;

if(semop(sem_id , &sem_b , 1) == -1){
    fprintf(stderr , "semaphore_p failed\n");
    return (0);
}

return (1);

}
static int semaphore_v(void){
    struct sembuf sem_b;

    sem_b.sem_num = 0;
    sem_b.sem_op = 1;
    sem_b.sem_flg = SEM_UNDO;
    if(semop(sem_id , &sem_b , 1) == -1){
        fprintf(stderr , "semaphore_v failed\n");
        return(0);
    }

    return (1);

}




在运行的时候,在命令行中 首先将第一个进程挂起,然后打开第二个进程就可以啦。

./test1 1 &

./test1 


这样就可以看到两个进程一直在交替访问共享的内存啦

站在巨人的肩膀上——Linux信号量操作

感谢那些让我度过此学海的无名勇士 信号量简介: 在对于临界区资源管理的过程中,多个程序同时访问一个共享资源经常容易引发一系列问题:如死锁,结果不唯一等等, 在1965年,由荷兰科学家E.W.Di...
  • qq_30168505
  • qq_30168505
  • 2016年11月05日 02:33
  • 1933

浅析Linux下的信号量

信号量用于进程间传递信号的一个整数值。在信号量上只有三种操作可以进行,初始化,递减和增加,这三种操作都是原子操作。递减的操作可以用于阻塞一个进程,增加操作可以用于接触阻塞一个进程。因此信号量也可以称之...
  • persistence_s
  • persistence_s
  • 2017年06月03日 18:08
  • 305

linux中信号量的概念和使用

linux中信号量的概念和使用 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。  ...
  • c453787298
  • c453787298
  • 2014年04月16日 14:24
  • 1851

Linux下的IPC-信号量的使用

几个进程映射同一内存区是一种最快的IPC方法,但单纯使用mmap,各进程之间,会有数据“不一致”的风险,需要一种机制保护共享区在某一时刻只允许一个进程操作,这时就要使用信号量了。因此本文可认为是上一篇...
  • guxch
  • guxch
  • 2011年09月01日 17:14
  • 5494

Linux多线程编程-信号量

在Linux中,信号量API有两组,一组是多进程编程中的System V IPC信号量;另外一组是我们要讨论的POSIX信号量。这两组接口类似,但不保证互换。POSIX信号量函数都已sem_开头,并不...
  • u012796139
  • u012796139
  • 2015年07月03日 16:54
  • 1287

Linux_信号与信号量

信号: 信号机制是类UNIX系统中的一种重要的进程间通信手段之一。我们经常使用信号来向一个进程发送一个简短的消息。例如:假设我们启动一个进程通过socket读取远程主机发送过来的网络数据包,此时由于网...
  • sty23122555
  • sty23122555
  • 2016年05月22日 09:52
  • 1595

分别在windows和linux下用信号量解决生产者消费者问题

用信号量解决生产者消费者问题                                       实验目的   通过实验,掌握Windows和Linux环境下互斥锁和信号量的实现 方法...
  • yxq_fxd
  • yxq_fxd
  • 2016年05月15日 16:53
  • 715

Linux下用信号量实现对共享内存的访问保护(一)

最近一直在研究多进程间通过共享内存来实现通信的事情,以便高效率地实现对同一数据的访问。本文中对共享内存的实现采用了系统V的机制,我们的重点在于通过信号量来完成对不同进程间共享内存资源的一致性访问,共享...
  • zacklin
  • zacklin
  • 2012年02月07日 11:17
  • 5098

UCOS_II学习笔记---信号量管理之信号量的使用-进程(任务)同步

示例代码: #include #define TEST_SEM_EN 0 //test switch, 0: off 1:on #define TASK_STK_SIZE 128 ...
  • dl0914791011
  • dl0914791011
  • 2012年12月18日 09:40
  • 2301

Java中Semaphore(信号量)的使用

Semaphore的作用:在java中,使用了synchronized关键字和Lock锁实现了资源的并发访问控制,在同一时间只允许唯一了线程进入临界区访问资源(读锁除外),这样子控制的主要目的是为了解...
  • zbc1090549839
  • zbc1090549839
  • 2016年11月29日 10:30
  • 7321
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下信号量的使用
举报原因:
原因补充:

(最多只允许输入30个字)