From 70a07f11bb8c514281ebf97d23e67b4dc59ac990 Mon Sep 17 00:00:00 2001 From: fastium Date: Fri, 8 May 2026 15:26:31 +0200 Subject: [PATCH] feat(lab04): exercise 1 --- .gitignore | 1 + src/04-multiprocessing/Makefile | 2 +- src/04-multiprocessing/main.c | 100 ----------------- src/04-multiprocessing/multiprocessing | Bin 18384 -> 0 bytes src/04-multiprocessing/process.c | 148 +++++++++++++++++++++++++ 5 files changed, 150 insertions(+), 101 deletions(-) delete mode 100644 src/04-multiprocessing/main.c delete mode 100755 src/04-multiprocessing/multiprocessing create mode 100644 src/04-multiprocessing/process.c diff --git a/.gitignore b/.gitignore index 7140184..dae7a28 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,4 @@ doc/**/*.pdf build src/03-led-controller/led-controller +src/04-multiprocessing/multiprocessing diff --git a/src/04-multiprocessing/Makefile b/src/04-multiprocessing/Makefile index 0b71c82..71698a0 100644 --- a/src/04-multiprocessing/Makefile +++ b/src/04-multiprocessing/Makefile @@ -1,5 +1,5 @@ EXE=multiprocessing -SRCS=$(wildcard *.c) +SRCS=process.c # Include the standard application Makefile for the CSEL1 labs include ../appl.mk diff --git a/src/04-multiprocessing/main.c b/src/04-multiprocessing/main.c deleted file mode 100644 index ef1d352..0000000 --- a/src/04-multiprocessing/main.c +++ /dev/null @@ -1,100 +0,0 @@ -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - - -const char * MSG = "Nique ta mère !!\0"; - -static void catch_signal(int signal) { - - switch (signal) { - case SIGHUP: - printf("SIGHUP received\n"); - break; - case SIGINT: - printf("SIGINT received\n"); - break; - case SIGQUIT: - printf("SIGQUIT received\n"); - break; - case SIGTERM: - printf("SIGTERM received\n"); - break; - case SIGABRT: - printf("SIGABRT received\n"); - break; - } - - -} - -static void install_catch_signal() -{ - struct sigaction act = { - .sa_handler = catch_signal, - }; - sigemptyset(&act.sa_mask); - sigaction(SIGHUP, &act, 0); - sigaction(SIGINT, &act, 0); - sigaction(SIGQUIT, &act, 0); - sigaction(SIGTERM, &act, 0); - sigaction(SIGABRT, &act, 0); -} - - -int main(int argc, char* argv[]) { - - install_catch_signal(); - - /* Setup socket for inter-process communication */ - int fd[2]; - int err = socketpair(AF_UNIX, SOCK_STREAM, 0, fd); - if (err == -1) { - perror("socketpair fail"); - exit(1); - } - - /* Fork a child process */ - pid_t pid = fork(); - if (pid == 0) { - /* Parent processus */ - printf("Parent processus: pid=%d\n", pid); - - - - while(1) { - write(fd[0], MSG, strlen(MSG)); - sleep(1); - } - - - } else if (pid > 0) { - /* Child processus */ - printf("Child processus: pid=%d\n", pid); - char buffer[strlen(MSG)]; - - while(1) { - read(fd[1], buffer, strlen(MSG)); - printf("%s\n", buffer); - sleep(1); - } - - } else { - /* error */ - perror("fork fail"); - exit(1); - } - - - return 0; -} diff --git a/src/04-multiprocessing/multiprocessing b/src/04-multiprocessing/multiprocessing deleted file mode 100755 index ecd66d368f4070b866f76c40a40eb8ee72098609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18384 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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define __USE_GNU // not the define from the professor !!!!!!!!!!!!!!!!!!!!! +#include +#include + +const int NBR_MSG = 5; +const char * MSG[] = { + "Hallo, hallo !\0", + "ça geht !\0", + "Comment vont les olives ?\0", + "Sacré trucs tes trucs là.\0", + "Ta où les vaches !!!!!\0" +}; + +static void catch_signal(int signal) { + + switch (signal) { + case SIGHUP: + printf("SIGHUP received\n"); + break; + case SIGINT: + printf("SIGINT received\n"); + exit(EXIT_SUCCESS); + break; + case SIGQUIT: + printf("SIGQUIT received\n"); + break; + case SIGTERM: + printf("SIGTERM received\n"); + break; + case SIGABRT: + printf("SIGABRT received\n"); + break; + } + + +} + +static void install_catch_signal() +{ + struct sigaction act = { + .sa_handler = catch_signal, + }; + sigemptyset(&act.sa_mask); + sigaction(SIGHUP, &act, 0); + sigaction(SIGINT, &act, 0); + sigaction(SIGQUIT, &act, 0); + sigaction(SIGTERM, &act, 0); + sigaction(SIGABRT, &act, 0); +} + + +int main(int argc, char* argv[]) { + + install_catch_signal(); + + /* Setup socket for inter-process communication */ + int fd[2]; + int err = socketpair(AF_UNIX, SOCK_STREAM, 0, fd); + if (err == -1) { + perror("socketpair fail"); + exit(1); + } + + /* Fork a child process */ + pid_t pid = fork(); + if (pid == 0) { + cpu_set_t set; + CPU_ZERO(&set); + CPU_SET(0, &set); + int ret = sched_setaffinity(pid, sizeof(set), &set); + if (ret == -1) { + perror("sched_setaffinity"); + exit(1); + } + + /* Parent processus */ + printf("Parent processus: pid=%d\n", pid); + pid_t child_pid = getpid(); + char buffer[100]; + + for (int i = 0; i < 7; i++) { + read(fd[1], buffer, strlen(MSG[i])); + printf("%s\n", buffer); + memset(buffer, 0, sizeof(buffer)); + } + + int status = 0; + int waited_pid = waitpid(pid, &status, 0); + + if (waited_pid == -1) { + perror("waitpid"); + } else { + if (WIFEXITED(status)) { + printf("Child exited with status %d\n", + WEXITSTATUS(status)); + } else if (WIFSIGNALED(status)) { + printf("Child killed by signal %d\n", + WTERMSIG(status)); + } + } + + } else if (pid > 0) { + cpu_set_t set; + CPU_ZERO(&set); + CPU_SET(1, &set); + int ret = sched_setaffinity(pid, sizeof(set), &set); + if (ret == -1) { + perror("sched_setaffinity"); + exit(1); + } + /* Child processus */ + printf("Child processus: pid=%d\n", pid); + + for (int i = 0; i < NBR_MSG; i++) { + if(i==2) sleep(2); + write(fd[0], MSG[i], strlen(MSG[i])); + } + + exit(EXIT_SUCCESS); + + } else { + /* error */ + perror("fork fail"); + exit(EXIT_FAILURE); + } + + /* Test signal handling */ + kill(getpid(), SIGHUP); + kill(getpid(), SIGQUIT); + kill(getpid(), SIGTERM); + kill(getpid(), SIGABRT); + kill(getpid(), SIGINT); + + return 0; +}