Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit952bee4ac4e4a97d30fc1d681ff0a9e5168fb9c8 (patch)
Author
 Syndamia <kamen@syndamia.com>
2023-12-02 20:19:43 +0200
Committer
 Syndamia <kamen@syndamia.com>
2023-12-02 20:19:43 +0200
Files673b8d043ed10194694131eeb2948fe4ff94bfac
uni-projects-952bee4ac4e4a97d30fc1d681ff0a9e5168fb9c8.tar
uni-projects-952bee4ac4e4a97d30fc1d681ff0a9e5168fb9c8.tar.gz
uni-projects-952bee4ac4e4a97d30fc1d681ff0a9e5168fb9c8.zip
Parentb50c86bd91351bfde316a4aa6e06e95588e4553f (diff)
[SP/P04] Solved exercises
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 <stdio.h> // printf, perror
+#include <unistd.h> // getpid, getppid, execlp
+#include <sys/types.h> // 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 <sys/wait.h> // wait
+#include <sys/types.h> // pid_t
+#include <stdio.h> // printf
+#include <unistd.h> // 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 <unistd.h> // fork, execl
+#include <sys/wait.h> // wait
+#include <sys/types.h> // pid_t
+#include <stdio.h> // 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 <unistd.h> // fork, execlp
+#include <sys/types.h> // pid_t
+#include <sys/wait.h> // wait
+#include <stdio.h> // 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);
+ }
+}