#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <errno.h>

union semun {
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT, IPC_SET */
unsigned short *array; /* array for GETALL, SETALL */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
#define MDMAKEY 567
union semun arg;

void MDM_initExecSem(void)
{
int ret;
arg.val = 0;
key_t key;

if ((key = ftok(".", 11)) == -1)
{
printf("ftok error");
return;
}

MDM_execSem=semget(key,1,IPC_CREAT|0666);//创建了一个权限为666的信号量
if(MDM_execSem==-1)
printf("semget creat err \n");
else
{
ret =semctl(MDM_execSem,0,SETVAL,arg);
if (ret < 0 )
{
printf("semctl semctl error \n");
semctl(MDM_execSem,0,IPC_RMID,arg);
}
else
{
printf("MDM_execSem init ok,val = %d \n",ret);
}
}
}

int OSSemPost_new(int *semid)
{
struct sembuf buf_add={0,1,IPC_NOWAIT};
int ret,ret0;
ret0=semctl(*semid,0,GETVAL,0);
//printf("add value \n");
//printf("semctl get old value=%d \n",ret);
ret=semop(*semid, &buf_add, 1);
if(ret== -1)
{
printf("OSSemPost_new err !\n");
return ret;
}
else
{
// ret=semctl(*semid,0,GETVAL,0);
// printf("OSSemPost_new succ,old val=%d,new value %d \n",ret0,ret);
return ret;
}
}

void OSSemSet_new(int *semid, INT16U cnt, INT8U *perr)
{
int ret,ret0;
struct sembuf buf ={ 0, -1, IPC_NOWAIT};
ret0 =semctl(*semid,0,GETVAL,0);
// printf("clear value \n");
// printf("semctl get value=%d \n",ret);
if(ret0)
{
buf.sem_op=0-ret0;
ret=semop(*semid, &buf, 1);
if(ret== -1)
{
// printf("OSSemSet_new err , val=%d,op=%d!\n",ret0,buf.sem_op);
*perr=1;
}
else
{
// ret =semctl(*semid,0,GETVAL,0);
// printf("OSSemSet_new succ,old val = %d , new val = %d \n",ret0,ret);
*perr=0;
}
}
// else
// {
// printf("value=%d,do not need clear! \n",ret);
// *perr=2;
// }
}

void OSSemPend_new(int *semid, INT16U timeout_ms, INT8U *perr)
{
// struct sembuf buf={0,-1,SEM_UNDO};
struct sembuf buf={0,-1,0};
struct timespec ts;
int ret,ret0;

ret0=semctl(*semid,0,GETVAL,0);
// printf("OSSemPend_new old val %d,want %d \n",ret,ret-1);
ts.tv_sec = (timeout_ms / 1000);
ts.tv_nsec = (timeout_ms - ts.tv_sec*1000L)*1000000L;
ret=semtimedop(*semid, &buf, 1, &ts);
if(ret==-1)
{
// printf("OSSemPend_new time out! \n");
if(errno=11)
{
*perr=0;
}
else
*perr=1;
}
else
{
// ret=semctl(*semid,0,GETVAL,0);
// printf("OSSemPend_new succ,old val=%d,new value %d \n",ret0,ret);
*perr=0;
}
}

ps:

ucos下信号量可以设值,在linux环境下好不容易才找的这个函数可以设置信号量的值;

主干其实就semctl,semop这些函数,因当时代码移植需要,进行了一次封装;

linux下信号量可设值的函数操作的更多相关文章

  1. Linux下C语言编程实现spwd函数

    Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...

  2. (原创)Linux下一定要4字节地址对齐操作

    Linux下一定要4字节地址对齐操作:“血”的教训,一定不要忘记!!! 当然不仅仅是Linux下,所有的32位机都应该如此!!!

  3. Linux下记录所有用户的登录和操作日志

    Linux下记录所有用户的登录和操作日志   一般我们可以用history命令来查看用户的操作记录,但是这个命令不能记录是哪个用户登录操作的,也不能记录详细的操作时间,且不完整:所以误操作而造成重要的 ...

  4. Linux下磁盘分区、挂载、卸载操作记录

    Linux下磁盘分区.挂载.卸载操作记录. 操作环境:CentOS release 6.5 (Final) Last :: from 118.230.194.76 [root@CentOS ~]# [ ...

  5. Linux下编译C代码,出现tan函数报错的情况

    undefined reference to `tan' 但是已经包含了头文件 <math.h>了,可还是报错,说是找不到tan 这个问题的原因不是很清楚, 但是网上给出的方案,就是编译的 ...

  6. MTU介绍以及在windows和linux下怎么设置MTU值

    最大传输单元MTU(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡 ...

  7. Linux下进行程序设计时,关于库的使用:

    一.gcc/g++命令中关于库的参数: -shared: 该选项指定生成动态连接库: -fPIC:表示编译为位置独立(地址无关)的代码,不用此选项的话,编译后的代码是位置相关的,所以动态载入时,是通过 ...

  8. [mmc]Linux下MMC/SD/SDIO的识别与操作

    转自:http://blog.csdn.net/skdkjzz/article/details/38927943 我们知道host在扫描卡的过程中,其识别的顺序为SDIO  SD MMC,并且从它的注 ...

  9. 归纳整理Linux下C语言常用的库函数----文件操作

    在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...

随机推荐

  1. C++学习笔记1_ 指针.引用

    1.引用的本质struct typeA{ int &a;}struct typeB{ int *a;}int main(void){ cout<<sizeof(struct typ ...

  2. MinIO 参数解析与限制

    MinIO 参数解析与限制 MinIO server 在默认情况下会将所有配置信息存到 ${HOME}/.minio/config.json 文件中. 以下部分提供每个字段的详细说明以及如何自定义它们 ...

  3. python学习之【第四篇】:Python中的列表及其所具有的方法

    1.前言 列表是Python中最常用的数据类型之一,是以[ ]括起来,每个元素以逗号隔开,而且里面可以存放各种数据类型,而且列表是有序的,有索引值,可切片,方便取值. 2.创建列表 li = ['he ...

  4. Scrapy进阶知识点总结(五)——Settings

    1.设置优先级 Scrapy中有不同层次的设置,其类型以及优先级如下(从高到低): 1.命令行命令中指定的设置 2.每个spider中的设置 3.scrapy项目中settings.py设置 4.命令 ...

  5. php 环境require(): open_basedir restriction in effect 错误

    php 环境require(): open_basedir restriction in effect 错误 错误日志显示,访问脚本不在 open_basedir的限定目录里面 解决方法打开fastc ...

  6. Rxjava2源码解析

    1:用法: Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer& ...

  7. keeplived离线安装openssl-devel依赖包

    转载自素文宅博客:https://blog.yoodb.com/yoodb/article/detail/1434 由于公司业务并发比较高需要高可用使用LVS keeplived.在linux系统ce ...

  8. Reporting service个人使用经验

    (此文章是从自己写的Word文档里复制过来的,图没有了,文字也有些乱,凑合看吧) 部署环境 Windows server 2012 R2 软件环境 安装完整的sqlsever2012,IIS服务 需要 ...

  9. pandas的使用(3)

    pandas的使用(3)

  10. 斐波那契数列的实现(C语言)

    int fibonacci(int positon){ if(position==1||position==2){ return 1; } return fibonacci(position-1)+f ...