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

//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. 全文搜索技术—Solr

    1.   学习计划 1. Solr的安装及配置 a)    Solr整合tomcat b)    Solr后台管理功能介绍 c)    配置中文分析器 2. 使用Solr的后台管理索引库 a)     ...

  2. 前端 webpack

    前端 webpack http://www.cnblogs.com/lvdabao/

  3. JS中深拷贝数组、对象、对象数组方法(转载)

    我们在JS程序中需要进行频繁的变量赋值运算,对于字符串.布尔值等可直接使用赋值运算符 “=” 即可,但是对于数组.对象.对象数组的拷贝,我们需要理解更多的内容. 首先,我们需要了解JS的浅拷贝与深拷贝 ...

  4. Weblogic10.3.6部署解决CXF webService 调用报错: “Cannot create a secure XMLInputFactory”

    一,解决步骤 1.添加jar包 stax2-api-3.1.4.jar woodstox-core-asl-4.4.1.jar 2.编写监听器 package com.neusoft.cxf.list ...

  5. catkin_make与gtest出现冲突的问题与解决

    gtest是测试时调用的,把测试禁止掉试试 catkin_make --pkg pkgname -DCATKIN_ENABLE_TESTING=0

  6. msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍

    1.ANY关键字 假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么, select ...from ... where a > any(.. ...

  7. tp5 select回显

    <select name="role_id" id="" class="form-control" required> {vol ...

  8. itunes win10应用商店安装 升级固件路径

    win + r 在运行中输入: %localappdata%\Packages\AppleInc.iTunes_nzyj5cx40ttqa\LocalCache\Roaming\Apple Compu ...

  9. 根据dateutil计算从前到现在过去多少时间

    import datetime from dateutil import relativedelta while 1: birthday = input(">>>" ...

  10. python str, list,tuple, dir

    Python3 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello ...