#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <unistd.h>

int main()
{
    pledge("stdio rpath wpath cpath proc", nullptr);

    int fd = shm_open("/shared", O_CREAT | O_RDWR, 0666);
    if (fd < 0)
    {
        perror("shm_open");
        return 1;
    }

    ftruncate(fd, PAGE_SIZE);

    void* address = mmap(nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (address == MAP_FAILED)
    {
        perror("mmap");
        return 1;
    }

    char* ptr = (char*)address;

    printf("the value is %c\n", *ptr);

    *ptr = 'a';

    pid_t child = fork();
    if (child < 0)
    {
        perror("fork");
        return 1;
    }
    if (child == 0)
    {
        *ptr = 'e';
        _exit(0);
    }

    waitpid(child, NULL, 0);

    printf("the value is %c\n", *ptr);

    return 0;
}