#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. 6、pytest -- 临时目录和文件

    目录 1. 相关的fixture 1.1. tmp_path 1.2. tmp_path_factory 1.3. tmpdir 1.4. tmpdir_factory 1.5. 区别 2. 默认的基 ...

  2. python基础-列表List及内置方法

    数据类型之列表-List 用途:用于存一个或多个不同类型的值 定义:通过中括号存值,每个值之间通过逗号进行分隔 l1 = [1,'a',3,'b'] 特性:有序.可变.存多个值的数据类型 常用方法: ...

  3. ThinkCMF 框架上的任意内容包含漏洞

    0x01  背景 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建. ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者 ...

  4. XSS与CSRF详解

    XSS与CSRF详解 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起 ...

  5. 【XSY2525】Maze 2017多校

    Description 考虑一个 N×M 的网格,每个网格要么是空的,要么是障碍物.整个网格四周都是墙壁(即第1行和第n行,第1列和第m列都是墙壁),墙壁有且仅有两处开口,分别代表起点和终点.起点总是 ...

  6. Oracle“ORA-00911: 无效字符”解决方式

    在工作中碰到ORA-00911:无效字符的问题, 代码如下: <select id="querySendMsg" parameterType="map" ...

  7. P3521 [POI2011]ROT-Tree Rotations(线段树合并)

    一句话题意(不用我改了.....):给一棵n(1≤n≤200000个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. ......这题输入很神烦呐... 给你一棵二叉树的dfs序 ...

  8. m96-97 lsc nc赛

    这一次 lsc 再一次一道题都没AC,看来lsc已经凉了! 出了分,旁边的_LH大喊了一声 “woc,lsc,你真是太垃圾!”...........“好吧!” 我确实很垃圾!(大佬这次都没考,所以我更 ...

  9. 『题解』Codeforces446C DZY Loves Fibonacci Numbers

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description In mathematical terms, the sequence \( ...

  10. Java面向对象程序设计第15章5

    5. 利用URLConnetction对象编写程序返回某网站的首页,并将首页的内容存放到文件当中. import java.net.*; import java.io.*; public class ...