#include "sys/ipc.h"
#include "sys/shm.h"
#include "unistd.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "stdio.h"
#include "stdlib.h"
int main(){
key_t key = 0x12345678;
int shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
if (fork() != 0){
int * ptr = (int *) shmat(shmid, 0, 0);
printf("shmid parent = %d\n", shmid
); *ptr = 6;
shmdt(ptr);
wait(NULL);
shmctl(shmid, IPC_RMID, NULL);
}
else{
printf("shmid child = %d\n", shmid
); int * ptr = (int *) shmat(shmid, 0, 0); // Works as expected
printf("ptr address = %p\n", ptr
); shmdt(ptr);
printf("Now child can exit normally\n"); }
return 0;
}
I2luY2x1ZGUgInN5cy9pcGMuaCIKI2luY2x1ZGUgInN5cy9zaG0uaCIKCiNpbmNsdWRlICJ1bmlzdGQuaCIKI2luY2x1ZGUgInN5cy90eXBlcy5oIgojaW5jbHVkZSAic3lzL3dhaXQuaCIKCiNpbmNsdWRlICJzdGRpby5oIgojaW5jbHVkZSAic3RkbGliLmgiCgppbnQgbWFpbigpewogICAga2V5X3Qga2V5ID0gMHgxMjM0NTY3ODsKICAgIGludCBzaG1pZCA9IHNobWdldChrZXksIHNpemVvZihpbnQpLCBJUENfQ1JFQVQgfCAwNjY2KTsKICAgIGlmIChmb3JrKCkgIT0gMCl7CiAgICAgICAgaW50ICogcHRyID0gKGludCAqKSBzaG1hdChzaG1pZCwgMCwgMCk7IAogICAgICAgIHByaW50Zigic2htaWQgcGFyZW50ID0gJWRcbiIsIHNobWlkKTsKICAgICAgICAqcHRyID0gNjsKICAgICAgICBzaG1kdChwdHIpOwogICAgICAgIHdhaXQoTlVMTCk7CiAgICAgICAgc2htY3RsKHNobWlkLCBJUENfUk1JRCwgTlVMTCk7CiAgICB9CiAgICBlbHNlewogICAgICAgIHByaW50Zigic2htaWQgY2hpbGQgPSAlZFxuIiwgc2htaWQpOwogICAgICAgIGludCAqIHB0ciA9IChpbnQgKikgc2htYXQoc2htaWQsIDAsIDApOyAvLyBXb3JrcyBhcyBleHBlY3RlZAogICAgICAgIHByaW50ZigicHRyIGFkZHJlc3MgPSAlcFxuIiwgcHRyKTsKICAgICAgICBzaG1kdChwdHIpOwogICAgICAgIHByaW50ZigiTm93IGNoaWxkIGNhbiBleGl0IG5vcm1hbGx5XG4iKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cg==