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

//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. web前端整套面试题(一)--js相关

    一.单选 1.以下哪条语句会产生运行:(A) A.var obj = ( ); B.var obj = [ ]; C.var obj = { }; D.var obj = / /; B代表数组,C代表 ...

  2. 10 华电内部文档搜索系统 search04

    上一节我们着重讲解了权限过滤器的使用.这一节讲解一下补充一下Struts 2下面对应的Checkbox的使用.对索引下面的数据进行维护操作,一次可以删除多个.在Struts 2下面使用对应的Check ...

  3. [poj2104]kth-number(归并树求区间第k大)

    复杂度:$O(nlog^3n)$ #include<cstdio> #include<cstring> #include<algorithm> #include&l ...

  4. 快速上手Runtime(四)之动态添加方法

    如果一个类方法非常多,加载类到内存的时候也比较耗费资源,可以使用动态给某个类,添加方法解决.做到优化内存,节省资源的效果. // // Person.m // ResolveInstanceMetho ...

  5. Appium+python自动化-Remote远程控制

    前言 在第三篇启动app的时候有这样一行代码driver = webdriver.Remote('http://192.168.1.1:4723/wd/hub', desired_caps),很多小伙 ...

  6. style多次设置行内样式

    语法 style="font-size:32px;background-color:#aaa"

  7. labelimg

    ------------------------labelimg------------------------- cd /home/luo/TensorflowProject/labelImg py ...

  8. 解决VS2013中的控制台一闪而过的问题

    修改项目配置,右键点击项目,在右键菜单中选择属性,然后在弹出的对话框左侧列表中中选择 “配置属性”-->“链接器”-->“系统”,然后在右侧的列表中, 在第一项”子系统“的值中选择”控制台 ...

  9. CS的项目管理是基于多租户理念设计

    1.创建项目 http://xxx.xxx.xx.xx:8080/client/api?command=createProject&response=json&sessionkey=8 ...

  10. [C++] Deep copy ,Shallow copy, copy constructor,"="

    Deep copy ,Shallow copy, copy constructor,"=" Dog.h #pragma once class Dog { public: char ...