歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Linux下的多進程間共享資源的互斥訪問

Linux下的多進程間共享資源的互斥訪問

日期:2017/3/3 16:24:00   编辑:關於Linux
#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

Copyright © Linux教程網 All Rights Reserved