一、进程一
#include<unistd.h>
#include<sys/mman.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/shm.h>
typedef struct
{
pthread_mutex_t mutex;
pthread_mutexattr_t mutexattr;
}mt;
int main(void)
{
int fd = open("/online/temp/sh" , O_RDWR|O_CREAT, 0777);
ftruncate(fd,sizeof(mt));
mt* mm = mmap(NULL,sizeof(mt),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
pthread_mutexattr_init(&mm->mutexattr); // 初始化 mutex 属性
pthread_mutexattr_setpshared(&mm->mutexattr, PTHREAD_PROCESS_SHARED); // 修改属性为进程间共享
pthread_mutex_init(&mm->mutex,&mm->mutexattr); // 初始化一把 mutex 锁
int i=0;
while(1)
{
pthread_mutex_lock(&mm->mutex);
printf("mutex1:%d\n",i++);
pthread_mutex_unlock(&mm->mutex);
sleep(1);
}
return 0;
}
二、进程二
#include<unistd.h>
#include<sys/mman.h>
#include<pthread.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/shm.h>
typedef struct
{
pthread_mutex_t mutex;
pthread_mutexattr_t mutexattr;
}mt;
int main(void)
{
int fd = open("/online/temp/sh" , O_RDWR|O_CREAT, 0777);
ftruncate(fd,sizeof(mt));
mt* mm = mmap(NULL,sizeof(mt),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
pthread_mutexattr_init(&mm->mutexattr); // 初始化 mutex 属性
pthread_mutexattr_setpshared(&mm->mutexattr, PTHREAD_PROCESS_SHARED); // 修改属性为进程间共享
pthread_mutex_init(&mm->mutex,&mm->mutexattr); // 初始化一把 mutex 锁
int i=0;
while(1)
{
sleep(5);
pthread_mutex_lock(&mm->mutex);
sleep(5);
printf("mutex2:%d\n",i++);
pthread_mutex_unlock(&mm->mutex);
}
return 0;
}
三、实验现象
进程一在进程二未解锁时,阻塞5秒,解锁完毕后,输出5秒。