sem_shm_test.c
来自「这个代码特点是由System V的IPC对象信号量和共享内存模拟了多进程间的同步」· C语言 代码 · 共 94 行
C
94 行
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#define KEY 0x101
int init( void );
void p( int semid );
void v( int semid );
main()
{
int shmid, semid,i;
int flag=0,flag1=0;
pid_t pid;
char *ptr;
shmid = shmget( KEY, 32, IPC_CREAT|0600 );
ptr = (char *)shmat( shmid, NULL, 0 );
semid = init( );
if((pid=fork())==0)
{ while(flag==0){
p( semid );
if(ptr[0] == 11) {
printf( "now I can write the ptr[1]\n");
fflush( stdout);
ptr[1]=22;
flag=1;
}
v( semid );
}
sleep(1);
exit(0);
}
else
{ while(flag1==0){
p( semid );
ptr[0] = 11;
if(ptr[1] == 22) {
printf( "now I have checked the ptr[1]\n");
flag1=1;
}
v( semid );
}
sleep(1);
}
// 释放共享内存
shmdt( ptr );
shmctl( shmid, IPC_RMID, 0 );
semctl( semid, 0,IPC_RMID, 0 );
}
void p( int semid )
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = -1;
buf.sem_flg = SEM_UNDO;
semop( semid, &buf, 1 );
}
void v( int semid )
{
struct sembuf buf;
buf.sem_num = 0;
buf.sem_op = 1;
buf.sem_flg = SEM_UNDO;
semop( semid, &buf, 1 );
}
int init()
{
int semid;
if( (semid = semget( KEY, 1, IPC_CREAT|IPC_EXCL|0600 )) == -1 )
semid = semget( KEY, 1, 0 );
else
semctl( semid, 0, SETVAL, 1 );
return( semid );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?