linux进程之间互斥
2014-04-15 20:24
274 查看
总所周知,在linux中pthread_mutex_t可以用于同一进程内多个线程之间的同步。我们所需要做的工作,仅仅是定义一个全局的pthread_mutex_t类型变量即可。但是对于进程之间的互斥,就没有那么简单了。我们必须将pthread_mutex_t类型变量放到各个进程都能够访问得到的共享内存中。
对于进程之间的互斥,有如下实例:
这里面需要注意的几点是:
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
对于进程之间的互斥,有如下实例:
/* author:song0071000#126.com function:mutual exclusion of process time:2014-04-15 */ #include <stdio.h> #include <stdlib.h> #include <error.h> #include <pthread.h> #include <sys/mman.h> #include <fcntl.h> #include <string.h> 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<%s> 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<%s> 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
相关文章推荐
- 多进程之间的互斥信号量实现(Linux和windows跨平台)
- Linux下进程之间信号量互斥、同步
- Linux多线程与进程之间通信 实例2
- Linux下的多进程间共享资源的互斥访问
- linux下使用socket中的select完成单线程单进程多用户之间通信
- 【Linux系统编程】进程同步与互斥:POSIX有名信号量
- linux程序设计——pipe调用在两进程之间通信(第十三章)
- linux内核中多进程(线程)间同步和互斥
- Linux 进程管理剖析: Linux 同步方法剖析 内核原子,自旋锁和互斥锁
- Linux下进程的同步互斥实例——生产者消费者
- pstree命令_Linux pstree 命令用法详解:以树状图的方式展现进程之间的派生关系
- Linux进程之间的8种通信方式
- Linux下的多进程间共享资源的互斥访问
- Linux下进程的同步互斥实例——生产者消费者
- Linux进程,进程组,会话之间关系
- 不同进程之间的互斥锁的使用
- linux多进程多线程互斥同步例子
- 【Linux】fg、bg让你的进程在前后台之间切换
- Linux 进程管理剖析: Linux 同步方法剖析 内核原子,自旋锁和互斥锁
- Linux0.11内核--进程的调度(就绪态和运行态之间的转换)