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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值