1. 使用posix有名信号量进行同步
有名信号量既可用于线程间的同步,又可用于进程间的同步。
两个进程,对同一个共享内存读写,可利用有名信号量来进行同步。一个进程写,另一个进程读,利用两个有名信号量semr, semw。semr信号量控制能否读,初始化为0。 semw信号量控制能否写,初始为1。
示例代码如下:
//读共享内存
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
typedef struct _Teacher
{
char name[64];
int age;
}Teacher;
int main()
{
int shmid = -1;
key_t key = 0x2234;
Teacher *p = NULL;
sem_t *semr = NULL, *semw = NULL;
semr = sem_open("sem_r", O_CREAT | O_RDWR, 0666, 0);
if (semr == SEM_FAILED )
{
printf("errno = %d\n", errno );
return -1;
}
semw = sem_open("sem_w", O_CREAT | O_RDWR, 0666, 1 );
if (semw == SEM_FAILED)
{
printf("errno = %d\n", errno );
return -1;
}
shmid = shmget(key, 0, 0 );
if ( shmid == -1 )
{
printf("shmget failed\n");
perror("shmget err");
return -1;
}
p = (Teacher*)shmat(shmid, NULL, 0);
if (p == (Teacher*)(-1))
{
printf("shmat failed\n");
perror("shmat");
return -1;
}
while(1)
{
sem_wait(semr);
printf("name:%s\n", p->name);
printf("age