#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <semaphore.h>
int fun(sem_t **mm, int *id)
{
int shm_id,i;
key_t key;
char temp;
sem_t *p_map;
char* name = "/dev/shm/pulse-shm-309013537";
key = ftok("/home/luguangxu/mm/sharememory/write_m.c",1);
if( key == -1 )
{
perror("ftok error");
return -1;
}
shm_id=shmget(key, 1024, IPC_CREAT|S_IRUSR|S_IWUSR );
if(shm_id==-1)
{
perror("shmget error");
return -1;
}
*mm =(sem_t *)shmat(shm_id, NULL, 0);
if( NULL != id )
*id = shm_id;
return 0;
}
int main()
{
sem_t *mm,*nn;
pid_t fd;
int ret;
int id;
ret = fun(&mm,&id);
if( 0 != ret )
return -1;
ret = sem_init(mm, 1, 1);
if( 0 != ret )
{
perror("sem_init error");
return -1;
}
nn = mm+1;
ret = sem_init(nn, 1, 0);
if( 0 != ret )
{
perror("sem_init error");
return -1;
}
if( -1 == shmdt(mm) )
{
perror("detach error ");
return -1;
}
printf("ha ha yes !!! \n");
mm = nn = NULL;
fd = fork();
if( fd < 0 )
{
perror("fork error");
return -1;
}
//printf("ha ha yes !!! \n");
if( 0 == fd )
{
ret = fun(&mm, NULL);
nn = mm+1;
if( 0 != ret )
return -1;
ret = 5;
while( ret )
{
sem_wait(mm);
printf("11111111 \n");
sem_post(nn);
//sleep(1);
ret--;
}
if( -1 == shmdt(mm) )
{
perror("detach error ");
return -1;
}
return 0;
}
else
{
ret = fun(&mm, NULL);
nn = mm+1;
if( 0 != ret )
return -1;
ret = 5;
while( ret )
{
sem_wait(nn);
printf("2222222222 \n");
sem_post(mm);
//sleep(2);
ret--;
}
}
sem_destroy(mm);
sem_destroy(nn);
if( -1 == shmdt(mm) )
{
perror("detach error ");
return -1;
}
ret = shmctl(id,IPC_RMID ,NULL);
if( 0 != ret )
{
perror("shmctl error ");
return -1;
}
return 0;
}