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

//Makefile
commh=comm.h
src=sem.c comm.c
dst=sem
cc=gcc
$(dst):$(src) $(commh)
$(cc) -o $@ $^
.PHONY:clean
clean:
rm -rf $(dst) //comm.h
#ifndef __COMM_H__
#define __COMM_H__
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/sem.h>
#define PATHNAME "."
#define PROJID 0666
union SemUn
{
int val;
struct semid_ds *buf;
unsigned short *array;
struct seminfo *__buf;
};
int creatSemSet(int nums);
int getSemSet();
int initSemSet(int semid,int which);
int P(int semid);
int V(int semid);
int destorySemSet(int semid);
#endif //comm.c
#include"comm.h"
static int commSemSet(int nums,int flags)
{
key_t _k=ftok(PATHNAME,PROJID);
if(_k==-1)
{
perror("ftok");
return -1;
}
int semid=semget(_k,nums,flags);
if(semid<0)
{
perror("semget");
return -1;
}
return semid;
} int creatSemSet(int nums)
{
return commSemSet(nums,IPC_CREAT | IPC_EXCL | 0666);
} int getSemSet()
{
return commSemSet(0,0);
} int initSemSet(int semid,int which)
{
union SemUn _SemUn;
_SemUn.val=1;
if(semctl(semid,which,SETVAL,_SemUn)<0)
{
perror("semctl");
return -1;
}
return 0;
} static int SemOp(int semid,int op,int which)
{
struct sembuf buf[1];
buf[0].sem_op=op;
buf[0].sem_num=which;
if(semop(semid,buf,1)==-1)
{
perror("semop");
return -1;
}
return 0;
} int P(int semid)
{
return SemOp(semid,-1,0);
} int V(int semid)
{
return SemOp(semid,1,0);
} int destorySemSet(int semid)
{
if(semctl(semid,0,IPC_RMID,NULL)==-1)
{
perror("semctl");
return -1;
}
return 0;
} //sem.c
#include"comm.c"
int main()
{
int semid=creatSemSet(1);
initSemSet(semid,0);
pid_t id=fork();
if(id==0)
{
int semid=getSemSet();
while(1)
{
P(semid); //进入临界区
printf("A");
fflush(stdout);
usleep(10031);
printf("A");
fflush(stdout);
usleep(10021);
V(semid);
}
}
else
{
while(1)
{
P(semid); //进入临界区
printf("B");
fflush(stdout);
usleep(10051);
printf("B");
fflush(stdout);
usleep(10003);
V(semid);
}
}
destorySemSet(semid);
}

Linux下的信号量的更多相关文章

  1. linux 下的信号量参数

    linux 下的信号量参数 转载自:http://blog.itpub.net/26110315/viewspace-718306/ 信号量是一种锁机制用于协调进程之间互斥的访问临界资源.以确保某种共 ...

  2. Linux下用信号量实现对共享内存的访问保护

    转自:http://www.cppblog.com/zjl-1026-2001/archive/2010/03/03/108768.html 最近一直在研究多进程间通过共享内存来实现通信的事情,以便高 ...

  3. linux下的信号量PV操作进阶之路

    一.同步和互斥机制 信号量 互斥锁 同步:指多个任务按照约定的先后次序相互配合来完成一件事情. 比如读线程等待写线程写完之后再去读. 二.信号量-P/V操作 P(s)含义: if(信号量>0) ...

  4. 在linux下利用信号量实现一个写者线程多个读者线程

    #include<pthread.h> #include<string.h> #include<stdlib.h> #include<stdio.h> ...

  5. 【Linux】Semaphore信号量线程同步的例子

    0. 信号量 Linux下的信号量和windows下的信号量稍有不同. Windows Windows下的信号量有一个最大值和一个初始值,初始值和最大值可以不同.  而且Windows下的信号量是一个 ...

  6. 【转】Linux下Fork与Exec使用

    Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...

  7. 在Linux下的中断方式读取按键驱动程序

    // 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) ...

  8. Linux下c开发 之 线程通信(转)

    Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...

  9. linux 下进程通讯详解

    linux 下进程通讯方法主要有以下六种: 1.管道 2.信号 3.共享内存 4.消息队列 5.信号量 6.socket

随机推荐

  1. 【总结整理】自带天气app,为什么还要下载

    很简单那就说明用户对天气这个功能的需求并没有表面那么简单呗,还有更深层次的需求~ 先声明我自己是没有这方面需求的,我就纯属YY一下 既然数据都一样的话,那是什么让用户觉得天气APP更专业呢? 1.历史 ...

  2. zabbix自定义key监控redis

    一.启动redis-server cd /data/redis redis-server redis.conf (根据自己的环境启动redis) 测试脚本(写入1000个数据): seq |while ...

  3. Python学习笔记_使用openpyxl操作Excel,在同一个文件里复制某一个sheet

    应用场景:定制一个Excel模板文件,其中定义了一个模板Sheet,以此模板文件里的模板sheet为样例,制作报表,里面有不止一个模板样例Sheet 一.软件环境: 1.OS:Win10 64位 2. ...

  4. Python binascii

    Python binascii模块 Python binascii模块 用处 包含的函数 相关内置函数 code使用示例 转载请标明出处(http://blog.csdn.net/lis_12/art ...

  5. 面向对象的JavaScript-001

    一. Question是父类,MultipleChoiceQuestion和DragDropQuestion是子类 二. 1. <script> // 面向对象 function Ques ...

  6. CentOS-yum基本使用

    CentOS: yum URL: ftp://172.16.0.1/pub/ YUM: yellow dog, Yellowdog Update Modifier yum repository: yu ...

  7. HTML的DOM树结构

    在面试连续跪了两轮后,我觉得两个月的前端白学了.主要的原因是学而不思,知识是零散的,并没有组织起来.于是,我决定从今天起,复习并总结一下前端的知识点. 一般的网页浏览者看到的是网页的整体外观,前端开发 ...

  8. Perl语言编程>>学习笔记

    1. 使用反引号可以调用外部程序并返回程序的输出, 如  $cwd = `pwd`; 2. Perl 中的变量类型之间的区别主要是单数和复数; 单数变量称为标量 $scalar , 复数变量称为数组 ...

  9. .NET开源MSSQL、Redis监控产品Opserver之Redis配置

    安全与基础配置地址:http://www.cnblogs.com/xiaopotian/p/6898310.html edis监控数据实例的加载可以查看Opserver.Core项目data/Redi ...

  10. [GO]空接口

    package main import "fmt" //空接口的实际意义就在于在使用函数时,空接口可以接收任意类型的值,类似于python中的*args, **kwargs fun ...