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下通过共享内存进行进程间通信,进程间同步使用信号量来实现

Linux 环境下C编程指南,通过共享内存进行进程间通信的例子,进程间同步使用信号量来实现。、 书中有几个错误。。 使用说明:这是一个简单的服务器和客户端程序,如果启动程序时不带参数,则执...

Linux下的IPC-信号量的使用

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

Linux下多任务间通信和同步-POSIX信号量

Linux下多任务间通信和同步-POSIX信号量嵌入式开发交流群280352802,欢迎加入! POSIX信号量是另一种信号量的实现.它的定义和功能有System V信号量基本一样,不同的是这组信号量...
  • ce123
  • ce123
  • 2013年11月26日 10:53
  • 2567

Linux下信号量实现进程同步、互斥(生产者消费者问题)

linux的进程同步互斥实现生产者和消费者

linux下信号量和互斥锁的区别

之前一直没有怎么关注过这个问题,前些日子在面试一家公司的时候,面试官提到了pthread_cond_wait/pthread_cond_signal的实现,当时答的不是很好,回来就查了nptl的代码。...
  • zxy_cs
  • zxy_cs
  • 2011年12月21日 10:14
  • 7743

浅析Linux下的信号量

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

Linux下IPC主题二-------------信号量

一、什么是信号量 信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的...

linux下的信号量

一、什么是信号量??? 信号量的本质是一种数据操作锁、用来负责数据操作过程中的互斥、同步等功能。 信号量用来管理临界资源的。它本身只是一种外部资源的标识、不具有数据交换功能,而是通...
  • LF_2016
  • LF_2016
  • 2017年02月16日 20:44
  • 602

linux下c编程之信号量semget,semop,semctl函数

信号量 今天去参加北京市的植树志愿者活动啦!早上起来的挺早的,6:10就被杰子给叫起来啦,带着对春天的向往,我们坐着不花钱的大巴去做为市领导服务去啦!发了一个小红帽还有一个红色的制服。      ...

如何理解linux下的互斥量 信号量

一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程       希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误。       另外感谢以下链接的作者...
  • ss2jj
  • ss2jj
  • 2013年08月06日 15:52
  • 532
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下信号量的使用
举报原因:
原因补充:

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