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. ...
随机推荐
- CentOS 7 的root口令破解两种方法
破解CentOS7的root口令 方法一: 第一步: 启动时任意键暂停启动 按-e-键进入编辑模式 第二步: 1.将光标移动至蓝框处linux16开头的行,添加内核参数 rd.break 2.按ctr ...
- 解决本地无法访问vm虚拟机上centos7服务器中已配置好的hugo站点的问题
一.配置VM网络连接 打开vm,找到"编辑",打开"虚拟网络编辑器" 选中下面截图中的上方为类型为"NAT模式"那一栏,然后点击下方的&qu ...
- MySQL批量插入的分析以及注意事项
目录 1.背景 2.两种方式对比 2.1.一次插入一条数据 2.2.一次插入多条数据 3.拓展一下 4.Other 1.背景 我们在工作中基本都会碰到批量插入数据到DB的情况,这个时候我们就需要根据不 ...
- Python基础学习(一)之Python的概述与环境安装
Python介绍 Python语言介绍 Python是一门高级的.面向对象的.解释性.脚本语言. 高级语言:贴近开发者,对应底层语言,底层语言贴近机器:java.C#.php .ruby 面向对象对应 ...
- Ubuntu16.04安装Nginx+PHP5.6+MySQL5.6
安装Nginx 1.首先添加nginx_signing.key(必须,否则出错) $ wget http://nginx.org/keys/nginx_signing.key $ sudo apt-k ...
- html5 点击播放video的方法
html5 点击播放video的方法<pre> <video videosrc="{$vo.shipinurl}" controls="" x ...
- Java 调用 Hbase API 访问接口实现方案
HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”.就像Bigtable利用了Google文件 ...
- nyoj 467 中缀式变后缀式 (栈)
中缀式变后缀式 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀 ...
- 力扣(LeetCode)字符串中的单词数 个人题解
统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符. 请注意,你可以假定字符串里不包括任何不可打印的字符. 示例: 输入: "Hello, my name is John" ...
- TestNg练习001
15分钟入门TestNG 阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装TestNg TestNG最简单的测试 TestNG的基本注解 TestNG中如 ...