linux下信号量可设值的函数操作
#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下信号量可设值的函数操作的更多相关文章
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- (原创)Linux下一定要4字节地址对齐操作
Linux下一定要4字节地址对齐操作:“血”的教训,一定不要忘记!!! 当然不仅仅是Linux下,所有的32位机都应该如此!!!
- Linux下记录所有用户的登录和操作日志
Linux下记录所有用户的登录和操作日志 一般我们可以用history命令来查看用户的操作记录,但是这个命令不能记录是哪个用户登录操作的,也不能记录详细的操作时间,且不完整:所以误操作而造成重要的 ...
- Linux下磁盘分区、挂载、卸载操作记录
Linux下磁盘分区.挂载.卸载操作记录. 操作环境:CentOS release 6.5 (Final) Last :: from 118.230.194.76 [root@CentOS ~]# [ ...
- Linux下编译C代码,出现tan函数报错的情况
undefined reference to `tan' 但是已经包含了头文件 <math.h>了,可还是报错,说是找不到tan 这个问题的原因不是很清楚, 但是网上给出的方案,就是编译的 ...
- MTU介绍以及在windows和linux下怎么设置MTU值
最大传输单元MTU(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡 ...
- Linux下进行程序设计时,关于库的使用:
一.gcc/g++命令中关于库的参数: -shared: 该选项指定生成动态连接库: -fPIC:表示编译为位置独立(地址无关)的代码,不用此选项的话,编译后的代码是位置相关的,所以动态载入时,是通过 ...
- [mmc]Linux下MMC/SD/SDIO的识别与操作
转自:http://blog.csdn.net/skdkjzz/article/details/38927943 我们知道host在扫描卡的过程中,其识别的顺序为SDIO SD MMC,并且从它的注 ...
- 归纳整理Linux下C语言常用的库函数----文件操作
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
随机推荐
- pymssql的Connection相关特性浅析
关于Python的pymssql模块,之前研究时总结了"pymssql默认关闭自动模式开启事务行为浅析"这篇博客,但是在测试过程中又发现了几个问题,下面对这些问题做一些浅析,如有不 ...
- 一道国外前端面试题引发的Coding...
刚刚看到CSDN微信公众号一篇文章,关于国外程序员面试前端遇到的一道测试题,有点意思,遂写了下代码,并记录一下~ 题目是这样的: ['Tokyo', 'London', 'Rome', 'Donlon ...
- 最新JetBrains PyCharm 使用教程--安装教程(一)
安装过程 Pycharm 激活码 license server选项里边输入:http://intellij.mandroid.cn/
- 小白历险记:spingboot之helloworld
还记得入职第一天的时候,先安装了相关的软件,配置了环境.boss叫我写的第一个程序:搭建一个springboot工程,输出helloworld. 哈哈话不多说,回忆一下. 1.打开IDEA,点击Cre ...
- java多线程回顾4:线程通信
1.线程的协调运行 线程的协调运行有一个经典案例,即生产者和消费者问题. 假设有一个货架,生产者往货架上放货物,消费者从货架上取货物. 为了方便讲解,制定一个规则,生产者每放上一个货物,消费者就得取走 ...
- Apache安装问题:APR not found
资料来源:Apache遇到的问题:APR not found 安装apache时出现arp错误问题 按照以上文章试验之后整理如下: #./configure --prefix……检查编辑环境时出现: ...
- PHP实现微信企业付款到个人零钱步骤
微信支付企业付款到零钱功能应用广泛,比如微信红包奖励,业务结算等.通过企业向个人付款,付款资金将直接进入用户微信零钱. 一 开通条件 付款资金 企业付款到零钱资金使用商户号余额资金. 根据商户号的 ...
- PHP7中的异常与错误处理
PHP 中的 Exception, Error, Throwable PHP 中将代码自身异常(一般是环境或者语法非法所致)称作错误 Error,将运行中出现的逻辑错误称为异常 Exception 错 ...
- 02. JVM运行机制
JVM运行机制 JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一.JVM启动流程
- nyoj 32-组合数(next_permutation, stack, set)
32-组合数 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:8 submit:11 题目描述: 找出从自然数1.2.... .n(0<n< ...