linux进程互斥要点,linux进程之间互斥

总所周知,在linux中pthread_mutex_t可以用于同一进程内多个线程之间的同步。我们所需要做的工作,仅仅是定义一个全局的pthread_mutex_t类型变量即可。但是对于进程之间的互斥,就没有那么简单了。我们必须将pthread_mutex_t类型变量放到各个进程都能够访问得到的共享内存中。

对于进程之间的互斥,有如下实例:

/*

author:song0071000#126.com

function:mutual exclusion of process

time:2014-04-15

*/

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char* argv[])

{

int fd;

char dir[]="/simple.shm";

pthread_mutex_t* lock;

pthread_mutexattr_t mutexAttr;

fd = shm_open(dir,O_RDWR,0777);/*这里先检查是否能够成功打开共享内存对象。若该对象不存在,那么则将fd置为-1*/

/*not create yet*/

if(fd == -1)

{

printf("Shared memory open failed!\n",dir);

close(fd);

fd = shm_open(dir,O_CREAT|O_TRUNC|O_RDWR,0777);/*共享内存对象不存在,那么这里便创建该对象*/

if( -1 == fd )

{

printf("Shared memory create failed\n");

return -1;

}

if(ftruncate(fd,sizeof(pthread_mutex_t)))/*修改该共享内存的大小*/

{

printf("Shared ftruncate failed\n");

return -1;

}

lock = mmap(NULL,sizeof(pthread_mutex_t),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);/*进行内存映射,lock为共享内存对象的起始地址*/

if(lock == MAP_FAILED)

{

printf("Shared MAP_FAILED\n");

}

close(fd);

pthread_mutexattr_init(&mutexAttr);/*初始化互斥锁的属性*/

pthread_mutexattr_setpshared(&mutexAttr,PTHREAD_PROCESS_SHARED);/*设置互斥锁的属性*/

pthread_mutex_init(lock,&mutexAttr);/*互斥锁的初始化*/

}

else

{

lock = mmap(NULL,sizeof(pthread_mutex_t),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);/*若该共享内存对象已然存在,那么进行内存映射,lock指向共享内存对象的起始地址*/

close(fd);

}

printf("Shared memory open sucess in process 1!\n",dir);

int syslog_fd;

int i=0;

while(i<5)

{

pthread_mutex_lock(lock);/*加锁*/

/*create sys.log*/

syslog_fd = open("sys.log",O_CREAT|O_EXCL,0777);/*-----这里可以进行你自己要互斥的操作------*/

if(-1 == syslog_fd)

{

printf("You never see this!\n");

pthread_mutex_unlock(lock);

return -1;

}

printf("open one time in process 1!.\n");

sleep(1);

remove("sys.log");

pthread_mutex_unlock(lock);/*解锁*/

sleep(2);

i++;

}

return 0;

}

这里面需要注意的几点是:

1.这里面将共享内存对象的打开或创建写在一段代码里面了。这里得处理好pthread_mutex_t以及pthread_mutexaddr_t的初始化以及设置。它们都只能够被设置或初始化一次,也就是创建共享内存对象的时候。

2.posix共享内存对象路径名需使用/开头,但不能用/结尾

3.嵌入式应用中,可能无法使用共享内存。打印的错误代码为2,提示no such file or directory.

项目中需要使用共享内存对象,但是却死活创建不成功。折腾了很久,终于找到解决方法了。

可能是因为/dev/shm没有挂载。

需在/etc/fstat里面加上

none /dev/shm tmpfs defaults 0 0这样一行。并且在启动脚本中加入挂载语句

/bin/mkdir /dev/shm

/bin/mount /dev/shm

在posix共享内存对象创建之后,可以在/dev/shm中看到posix以路径名命名的共享内存对象。

程序在执行过程中,会用到/dev/shm这个目录。之前共享内存对象不能使用时,/dev/shm正好没有挂载,也许这就是为什么提示 no such file or directory的原因了吧。

具体可以用strace命令来查看。

这里有个使用strace查看跟踪程序运行过程的文章:

http://blog.163.com/ecy_fu/blog/static/44451262009622115339154/

关于共享内存对象的使用请查看unp 第二卷。

本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java定时器_拾遗Timer定时器

一 Timer 介绍在开发中我们经常会遇到一些简单定时任务的需求&#xff0c;而不需要量级较重的定时任务就可以采取java定时器&#xff1b;java.util.Timer工具类中的Timer 是定时器&#xff0c;但定时任务写在java.util.TimerTask 中&#xff0c;由 Timer 执行 TimerTask &#…

逻辑门电路的知识点归纳

1.半导体二极管与MOS管的开关特性 二极管&#xff1a;正向导通&#xff0c;反向截止&#xff0c;但是要注意的是从反向截止到正向导通的时间极其短&#xff0c;但是从正向导通到反向截止要经过反向恢复&#xff08;电荷存储效应&#xff09;的过程&#xff0c;这个过程实际上就…

全国计算机等级考试题库二级C操作题100套(第78套)

第78套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:将NN矩阵主对角线元素中的值与反向对角线对应位置上元素中的值进行交换。例如&#xff0c;若N3&#xff0c;有下列矩阵&#xff1a; 1 2 3 4 5 6 7 8 9 交换后为&#xff1a; 3 2 1 4 5 6 9 8 7 请在程序的下划线处…

善心

2019独角兽企业重金招聘Python工程师标准>>> 一个穷苦学生郝武德.凯礼&#xff0c;为了付学费&#xff0c;挨家挨户地推销货品。 到了晚上&#xff0c;发现自己的肚子很饿&#xff0c;而口袋里只剩下一个小钱。他在大街上犹豫徘徊了半天&#xff0c;终于鼓起勇气&a…

linux权限sudo和su,Linux su和sudo命令的区别,并获得root权限

su(superuser)su表示切换用户&#xff0c;如&#xff1a; 输入&#xff1a;su命令后回车表示切换当前的用户到root用户&#xff0c;或者&#xff1a; 输入&#xff1a;su - root(或者其他用户名)这里加了"-"后表示也切换的当前的环境变量到新用户的环境变量。su root…

python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路

一、Python 已来 AI 不远在当今&#xff0c;人工智能已经渗透到了智能手机、网络搜索&#xff0c;广告分发&#xff0c;人脸识别&#xff0c;语音识别&#xff0c;自动驾驶&#xff0c;智能医疗&#xff0c;无人银行等日常生活领域。人工智能的生活化是不可避免的&#xff0c;它…

软件测试 决策表

决策表技术使用的一下特征的应用 If then else 逻辑关系 输入变量之间存在逻辑关系 计算过程中涉及对输入变量子集的处理 输入与输出之间存在因果关系 圈复杂度较高 决策表规模的增长方式不高&#xff08;有N个条件的有限项决策表有2^N条规则&#xff09;&#xff0c;有几种方法…

js判断用户是否离开当前页面

简介 VisibilityChange 事件&#xff1b;用于判断用户是否离开当前页面 Code // 页面的 visibility 属性可能返回三种状态 // prerender&#xff0c;visible 和 hidden let pageVisibility document.visibilityState; // 监听 visibility change 事件 document.addEventLi…

全国计算机等级考试题库二级C操作题100套(第79套)

第79套&#xff1a; 给定程序中&#xff0c;函数fun的功能是:求ss所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回&#xff0c;并把其串长放在形参n所指变量中。ss所指字符串数组中共有M个字符串&#xff0c;且串长<N。 请在程序的下划线处填入正确的内容并把…

linux 交叉编译 静态库,在ARM交叉编译时,如何选择要链接的静态库?

小编典典您有两种选择&#xff0c;获取正确的编译器。编写自己的“ C”库。获取正确的编译器。你是 总是 最安全的有一个编译器匹配您的系统。这适用于x86Linux和各种发行版。如果不同的编译器可以工作&#xff0c;您将很幸运。当您交叉编译时&#xff0c;这样做会更加困难&…

python输出可执行文件_重定向-禁止在Python调用中输出可执行文件

重定向-禁止在Python调用中输出可执行文件我有一个名为B的二进制文件&#xff0c;该文件在调用时会生成输出。 如果从Bash shell调用它&#xff0c;则大多数输出将受到A > /dev/null的抑制。所有输出将受到A &> /dev/null的抑制我有一个名为B的Python脚本&#xff0c…

全国计算机等级考试题库二级C操作题100套(第80套)

第80套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;将形参n中&#xff0c;各位上为偶数的数取出&#xff0c;并按原来从高位到低位的顺序组成一个新的数&#xff0c;并作为函数值返回。 例如&#xff0c;从主函数输入一个整数&#xff1a;27638496&#x…

记一次B站答题经历

第一题部分&#xff1a;社区规范卷 --------- ------------ 第二题&#xff1a;社区规范第二部分 -------------------- 第三部分自由选择题 ---------------------- -------------------------------- 最后答题成绩得分 -------------- ------------- 答完题后的感受&#xff…

linux 安装程序丢失链接动态库,Linux安装软件过程中提示缺少动态链接库.so的解决方法...

Linux在安装软件的时候有时会出现错误&#xff0c;提示缺少动态链接库.so&#xff0c;该问题是由什么原因导致的呢?情况分析&#xff1a;1.缺少动态连接库.so-cannot open shared object file:No such file or directory2.缺少动态连接库.so.0-cannot open shared object file…

全国计算机等级考试题库二级C操作题100套(第81套)

第81套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;在形参s所指字符串中的每个数字字符之后插入一个号。例如&#xff0c;形参s所指的字符串为&#xff1a;def35adh3kjsdf7。执行结果为&#xff1a;def35adh3kjsdf7*。 请在程序的下划线处填入正确的内容并…

菜鸟python爬虫_Python爬虫学习-基础爬取

编译环境&#xff1a;python v3.5.0, mac osx 10.11.4第三方库&#xff1a;针对网页解析&#xff0c;python有丰富的第三方库如:BeautifulSoup, urllib, requests etc.可以通过import来引入指定第三方库&#xff0c;通过from lib import function导入第三方库中的指定函数。如&…

点云赋值 PointCloudT::Ptr 运行时崩溃

PointCloudT::Ptr cloud; cloud.reset(new PointCloudT); cloud->points.resize(500);for(int index 0;index <500;index){  cloud->point[index].x 1.0; cloud->point[index].y 1.0;}采用以上方式赋值程序崩溃。Point t; for(int index 0;index <500;ind…

yaf(5) smarty

2013年4月6日 13:41:37 参考: http://www.oschina.net/question/812776_71817 http://yaf.laruence.com/manual/yaf.class.dispatcher.setView.html 这两者都是在bootstrap.php中写_initSmarty()函数来重新实现yaf的视图接口 这中方案默认的是存放模版文件的上级文件夹名字必须…

全国计算机等级考试题库二级C操作题100套(第82套)

第82套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;找出100&#xff5e;999之间&#xff08;含100和999&#xff09;所有整数中各位上数字之和为x&#xff08;x为一正整数&#xff09;的整数,然后输出&#xff1b;符合条件的整数个数作为函数值返回。 例如…

linux最小安装桌面,Linux工作环境:CentOS7最小安装+Xfce桌面环境

ref: https://blog.csdn.net/smstong/article/details/448029893.1 执行CentOS7 最小安装去官网下载CentOS-7.0-1406-x86_64-Minimal.iso&#xff0c;然后刻录光盘&#xff0c;安装之。安装完成后执行yum update更新系统。然后&#xff0c;执行# yum install epel-release安装额…