Home
switch to mmap - bsleep - Unnamed repository; edit this file 'description' to name the repository. DIR Log DIR Files DIR Refs DIR README DIR LICENSE --- DIR commit 93eeaeaabcd36f08039ac5ea94ea7e309f2eccb0 DIR parent dc93ba1a8438c25f25be6ddfb051d48b028f9171 HTML Author: kroovy <me@kroovy.de> Date: Tue, 25 Feb 2025 00:25:30 +0100 switch to mmap Diffstat: M bsleep.c | 74 ++++++++----------------------- 1 file changed, 19 insertions(+), 55 deletions(-) --- DIR diff --git a/bsleep.c b/bsleep.c @@ -1,66 +1,30 @@ #define _POSIX_SOURCE #include <signal.h> -#include <stdint.h> #include <stdio.h> #include <stdlib.h> -#include <sys/types.h> +#include <sys/mman.h> #include <unistd.h> int main(void) { - int i, in; - pid_t pid; - int fd[2]; - char c = ' '; - - if (pipe(fd) == -1) { - printf("An error ocurred with opening the pipe\n"); - } - if (signal(SIGCHLD, SIG_IGN) == SIG_ERR) { - perror("signal"); - exit(EXIT_FAILURE); - } - pid = fork(); - - switch (pid) { - case -1: - perror("fork"); - exit(EXIT_FAILURE); - - case 0: - /* CHILD */ - - /* setup */ - close(fd[1]); - - /* read button press + count seconds */ - for (i=1;;i++) { - pread(fd[0], &c, sizeof(char), 0); - printf("\r[ press 'b' to interrupt: %ds ] [ '%c' was pressed ] ", i, c); fflush(stdout); - sleep(1); - } - /* cleanup */ - close(fd[0]); - exit(EXIT_SUCCESS); - - default: - /* PARENT */ - - /* setup */ - close(fd[0]); - system("/bin/stty raw -echo"); - - /* handle button-press */ - while ((in = getchar()) != 'b') { - write(fd[1], &in, sizeof(char)); - } + int i; + int *shared_memory = 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, *shared_memory); fflush(stdout); + sleep(1); + } + } else { + /* PARENT */ + system("/bin/stty raw -echo"); + while ((*shared_memory = getchar()) != 'b'); kill(pid, SIGKILL); - - /* cleanup */ - close(fd[1]); - system("/bin/stty cooked echo"); - printf("\n"); - exit(EXIT_SUCCESS); - } + system("/bin/stty cooked echo"); + printf("\n"); + } }