您的位置:首页 > 运维架构 > Linux

Linux下的多进程间共享资源的互斥访问

2013-02-22 17:52 218 查看


Linux下的多进程间共享资源的互斥访问

分类: Linux编程2010-05-04
19:21 1748人阅读 评论(0) 收藏 举报

把源代码运行一遍就知道了

[cpp] view
plaincopy

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/mman.h>

#include <pthread.h>

pthread_mutex_t* g_mutex;

//创建共享的mutex

void init_mutex(void)

{

int ret;

//g_mutex一定要是进程间可以共享的,否则无法达到进程间互斥

g_mutex=(pthread_mutex_t*)mmap(NULL, sizeof(pthread_mutex_t), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);

if( MAP_FAILED==g_mutex )

{

perror("mmap");

exit(1);

}

//设置attr的属性

pthread_mutexattr_t attr;

pthread_mutexattr_init(&attr);

//一定要设置为PTHREAD_PROCESS_SHARED

//具体可以参考http://blog.chinaunix.net/u/22935/showart_340408.html

ret=pthread_mutexattr_setpshared(&attr,PTHREAD_PROCESS_SHARED);

if( ret!=0 )

{

perror("init_mutex pthread_mutexattr_setpshared");

exit(1);

}

pthread_mutex_init(g_mutex, &attr);

}

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

{

init_mutex();

int ret;

char str1[]="this is child process/r/n";

char str2[]="this is father process/r/n";

int fd=open("tmp", O_RDWR|O_CREAT|O_TRUNC, 0666);

if( -1==fd )

{

perror("open");

exit(1);

}

pid_t pid;

pid=fork();

if( pid<0 )

{

perror("fork");

exit(1);

}

else if( 0==pid )

{

ret=pthread_mutex_lock(g_mutex);

if( ret!=0 )

{

perror("child pthread_mutex_lock");

}

sleep(10);//测试是否能够阻止父进程的写入

write(fd, str1, sizeof(str1));

ret=pthread_mutex_unlock(g_mutex);

if( ret!=0 )

{

perror("child pthread_mutex_unlock");

}

}

else

{

sleep(2);//保证子进程先执行

ret=pthread_mutex_lock(g_mutex);

if( ret!=0 )

{

perror("father pthread_mutex_lock");

}

write(fd, str2, sizeof(str2));

ret=pthread_mutex_unlock(g_mutex);

if( ret!=0 )

{

perror("father pthread_mutex_unlock");

}

}

wait(NULL);

munmap(g_mutex, sizeof(pthread_mutex_t));

}

运行后tmp文件内容为:

this is child process

this is father process
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: