From 952bee4ac4e4a97d30fc1d681ff0a9e5168fb9c8 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Sat, 2 Dec 2023 20:19:43 +0200 Subject: [SP/P04] Solved exercises --- Year 3/System programming/Practice04/ex1.c | 12 ++++++++++++ Year 3/System programming/Practice04/ex2.c | 19 +++++++++++++++++++ Year 3/System programming/Practice04/ex3.c | 16 ++++++++++++++++ Year 3/System programming/Practice04/ex4.c | 22 ++++++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 Year 3/System programming/Practice04/ex1.c create mode 100644 Year 3/System programming/Practice04/ex2.c create mode 100644 Year 3/System programming/Practice04/ex3.c create mode 100644 Year 3/System programming/Practice04/ex4.c diff --git a/Year 3/System programming/Practice04/ex1.c b/Year 3/System programming/Practice04/ex1.c new file mode 100644 index 0000000..da92ec6 --- /dev/null +++ b/Year 3/System programming/Practice04/ex1.c @@ -0,0 +1,12 @@ +#include // printf, perror +#include // getpid, getppid, execlp +#include // pid_t +int main(int argc, char* argv[]) { + pid_t pid = getpid(); + pid_t parent = getppid(); + printf("%d %d\n", pid, parent); + if (execlp("ps", "ps", (char*)NULL) < 0) { + perror("execlp"); + return 1; + } +} diff --git a/Year 3/System programming/Practice04/ex2.c b/Year 3/System programming/Practice04/ex2.c new file mode 100644 index 0000000..21f5f0e --- /dev/null +++ b/Year 3/System programming/Practice04/ex2.c @@ -0,0 +1,19 @@ +#include // wait +#include // pid_t +#include // printf +#include // getpid, getppid, fork + +int main(int argc, char* argv[]) { + printf("%d\n", getpid()); + + pid_t f = fork(); + printf("%d %d\n", f, getpid()); + if (f == 0) { // in child + printf("Parent: %d\n", getppid()); + } + else { + int status; + wait(&status); + printf("Child exit status: %d\n", status); + } +} diff --git a/Year 3/System programming/Practice04/ex3.c b/Year 3/System programming/Practice04/ex3.c new file mode 100644 index 0000000..dc32819 --- /dev/null +++ b/Year 3/System programming/Practice04/ex3.c @@ -0,0 +1,16 @@ +#include // fork, execl +#include // wait +#include // pid_t +#include // printf + +int main(int argc, char* argv[]) { + pid_t f = fork(); + if (f == 0) { // in child + execl(argv[1], argv[1], (char*)NULL); + } + else { + int status; + wait(&status); + printf("Exit status: %d\n", status); + } +} diff --git a/Year 3/System programming/Practice04/ex4.c b/Year 3/System programming/Practice04/ex4.c new file mode 100644 index 0000000..1014f5c --- /dev/null +++ b/Year 3/System programming/Practice04/ex4.c @@ -0,0 +1,22 @@ +#include // fork, execlp +#include // pid_t +#include // wait +#include // printf + +int main(int argc, char* argv[]) { + pid_t fork1 = fork(); + pid_t fork2 = fork(); + if (fork1 == 0) { // in child 1 + execlp(argv[1], argv[1], (char*)NULL); + } + else if (fork2 == 0) { // in child 2 + execlp(argv[2], argv[2], (char*)NULL); + } + else { + int firstStatus, secondStatus; + pid_t firstPID = wait(&firstStatus); + pid_t secondPID = wait(&secondStatus); + printf("%s %d\n", argv[1 + (firstPID != fork1)], firstStatus); + printf("%s %d\n", argv[1 + (secondPID != fork1)], secondStatus); + } +} -- cgit v1.3.1-23-gd82d