#include
#include
struct sharememory
{
int a;
};
struct sharememory_info
{
int id;
struct sharememory *shm;
};
int release_sharemem(int id, struct sharememory *shm);
int main(int argc, char *argv[])
{
int pid,endflg=0;
struct sharememory_info shmem_inf;
if(( shmem_inf.id = shmget(IPC_private,
sizeof(struct sharememory),
IPC_CREAT|0666)) == -1) {
perror("shmget");
return 0;
}
if((int)(shmem_inf.shm =(void *)shmat(shmem_inf.id, 0, 0)) == -1) {
perror("shmat");
release_sharemem(shmem_inf.id, shmem_inf.shm);
return 0;
}
shmem_inf.shm->a = 0;
printf("a = %d\n", shmem_inf.shm->a);
while(endflg==0){
if((pid = fork()) < 0) {
perror("fork");
release_sharemem(shmem_inf.id, shmem_inf.shm);
return 0;
}
if(pid == 0) {
if((int)(shmem_inf.shm =(void *)shmat(shmem_inf.id, 0, 0)) == -1) {
perror("shmat");
release_sharemem(shmem_inf.id, shmem_inf.shm);
_exit(0);
}
printf("cchild: input a: ");
scanf("%d",&shmem_inf.shm->a);
shmdt(shmem_inf.shm);
_exit(0);
}
if(pid > 0) {
wait(NULL);
if(shmem_inf.shm->a) endflg=1;
printf("a = %d\n",shmem_inf.shm->a);
}
}
release_sharemem(shmem_inf.id, shmem_inf.shm);
return 0;
}
int release_sharemem(int id, struct sharememory *shm)
{
if(id >= 0) {
shmdt(shm);
}
if(shmctl(id, IPC_RMID, 0) == -1) {
perror("shmctl");
exit(-1);
}
return 1;
}
|