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
總結
以上是生活随笔為你收集整理的linux进程互斥要点,linux进程之间互斥的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 做一个常规的banner图——负边距的使
- 下一篇: 掌握C语言判断素数(质数)相关内容
