Linux下的信号量
首先,什么是信号量?
信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责操作的互斥、同步等功能。
//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下的信号量的更多相关文章
- linux 下的信号量参数
linux 下的信号量参数 转载自:http://blog.itpub.net/26110315/viewspace-718306/ 信号量是一种锁机制用于协调进程之间互斥的访问临界资源.以确保某种共 ...
- Linux下用信号量实现对共享内存的访问保护
转自:http://www.cppblog.com/zjl-1026-2001/archive/2010/03/03/108768.html 最近一直在研究多进程间通过共享内存来实现通信的事情,以便高 ...
- linux下的信号量PV操作进阶之路
一.同步和互斥机制 信号量 互斥锁 同步:指多个任务按照约定的先后次序相互配合来完成一件事情. 比如读线程等待写线程写完之后再去读. 二.信号量-P/V操作 P(s)含义: if(信号量>0) ...
- 在linux下利用信号量实现一个写者线程多个读者线程
#include<pthread.h> #include<string.h> #include<stdlib.h> #include<stdio.h> ...
- 【Linux】Semaphore信号量线程同步的例子
0. 信号量 Linux下的信号量和windows下的信号量稍有不同. Windows Windows下的信号量有一个最大值和一个初始值,初始值和最大值可以不同. 而且Windows下的信号量是一个 ...
- 【转】Linux下Fork与Exec使用
Linux下Fork与Exec使用 转自 Linux下Fork与Exec使用 一.引言 对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值.for ...
- 在Linux下的中断方式读取按键驱动程序
// 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) ...
- Linux下c开发 之 线程通信(转)
Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...
- linux 下进程通讯详解
linux 下进程通讯方法主要有以下六种: 1.管道 2.信号 3.共享内存 4.消息队列 5.信号量 6.socket
随机推荐
- Perl 子程序(函数)
1.Perl 子程序(函数)Perl 子程序也就是用户定义的函数.Perl 子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读. Perl 子程序可以出现在程序的任何地方,语法 ...
- Reactjs+BootStrap开发自制编程语言Monkey的编译器:创建简易的页面IDE
http://localhost:3000/
- 用Box2d物理引擎设计类似愤怒小鸟投篮游戏 物理引擎的引入和基本框架搭建
- HRESULT:0x80070057 (E_INVALIDARG)
笔记本蓝屏后,在vs2010中调试项目时出现该异常, 解决方法:清空C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Fi ...
- shiro 权限集成Ehcache 配置 学习记录(二)
1.加入依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-eh ...
- BOOST_TYPEOF和BOOST_AUTO
1.简介 头文件<boost/typeof.hpp>里定义了两个宏:BOOST_TYPEOF和BOOST_AUTO,分别用于仿真C++新标准的typeof和auto关键字,可以在编译期自动 ...
- Python爬虫实战二之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...
- 一个新手后端需要了解的前端核心知识点之position(一)
以下内容是基于观看慕课网视频教程总结的知识点,边打代码边总结,符合自己的思维习惯.不是针对新手入门 我做程序的初衷是想做一个网站出来.HTML语言当然重要啊,缺什么就百度什么,很浪费时间,还是好好的打 ...
- 无归档情况下使用BBED处理ORA-01113错误
在丢失归档情况下,恢复时常会遇到ora-01113错误,以下实验模拟表空间offline,然后在丢失归档文件的情况下使用BBED修改文件头信息,最后恢复数据文件: 数据库版本: SQL> sel ...
- 实践作业4:Web测试实践(小组作业)每日任务记录1
会议时间:2017年12月21日会议地点:东九教学楼自习区主 持 人:王晨懿参会人员:王晨懿.余晨晨.郑锦波.杨潇.侯欢.汪元记 录 人:王晨懿会议议题:小组作业熟悉和任务分配 (一)选择待测产品 我 ...