(DIR) <- Back
A minimal example of C's syscall mmap() to share memory between processes
=========================================================================
Recently I decided to add a feature to bsleep:
My idea was to show the last button pressed (other than 'b', which would
interrupt the sleep).
The problem to overcome was the following:
When fork() is used, parent and child no longer can access each others
variables.
Since it's the parent-process reading the button pressed, while the child
is printing the update. Therefore the child needs to read the character
from the parent process.
Using mmap() I added a pointer to 1 byte of memory which both processes
can access. It stores the character of the last button pressed.
As a result bsleep has become a minimal example of:
- how to fork a process in C
- how to exchange data between parent and child process using mmap()
git clone git://kroovy.de/bsleep
Build dependencies
- C compiler
- libc
#define _POSIX_SOURCE
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>
int
main(void)
{
int i;
char *shmem = mmap(NULL, sizeof(char), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
pid_t pid = fork();
if (pid == 0) {
/* CHILD */
for (i=1;;i++) {
printf("\r[ press 'b' to interrupt: %ds ] [ '%c' was pressed ] ", i, *shmem);
fflush(stdout);
sleep(1);
}
} else {
/* PARENT */
system("/bin/stty raw -echo");
while ((*shmem = getchar()) != 'b');
kill(pid, SIGKILL);
system("/bin/stty cooked echo");
printf("\n");
}
}
In the near future I will consider adding error-handling and will have a
look at pagesize. It might be a good idea to let mmap claim a page-aligned
amount of bytes. Not sure at this point.