-
Notifications
You must be signed in to change notification settings - Fork 0
/
0006-lab07-pipe-idea.patch
107 lines (99 loc) · 2.54 KB
/
0006-lab07-pipe-idea.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
From e75f5632f416f0fb681162c48b3b976a15a5c615 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Herman?= <loic@loicherman.ch>
Date: Thu, 2 Nov 2023 14:18:32 +0100
Subject: [PATCH] feat: impl pipe
---
usr/src/sh.c | 75 +++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 62 insertions(+), 13 deletions(-)
diff --git a/usr/src/sh.c b/usr/src/sh.c
index 3569113..5571eb5 100644
--- a/usr/src/sh.c
+++ b/usr/src/sh.c
@@ -132,28 +132,77 @@ void process_cmd(void) {
/* General case - prepare to launch the application */
/* Prepare the arguments to be passed to exec() syscall */
+ int in_pipe, arg2_pos, pid_pipe;
+ char *argv2[ARGS_MAX];
+ int pipe_fd[2];
+ in_pipe = 0;
arg_pos = 0;
+ arg2_pos = 0;
+
while (tokens[arg_pos][0] != 0) {
- argv[arg_pos] = tokens[arg_pos];
- arg_pos++;
+ if (!in_pipe && !strcmp(tokens[arg_pos], "|")) {
+ in_pipe = 1;
+ argv[arg_pos] = NULL;
+ } else {
+ if (in_pipe) {
+ argv2[arg2_pos] = tokens[arg_pos];
+ ++arg2_pos;
+ } else {
+ argv[arg_pos] = tokens[arg_pos];
+ }
+ }
+
+ ++arg_pos;
}
+
/* Terminate the list of args properly */
- argv[arg_pos] = NULL;
+ if (in_pipe)
+ argv2[arg2_pos] = NULL;
+ else
+ argv[arg_pos] = NULL;
pid_child = fork();
- if (!pid_child) { /* Execution in the child */
-
- strcpy(filename, tokens[0]);
- argv[0] = tokens[0];
+ if (!pid_child) { // Execution in the child
+ if (in_pipe) {
+ pipe(pipe_fd);
+ pid_pipe = fork();
+
+ if (!pid_pipe) { // execution of the first child
+ close(pipe_fd[0]);
+ dup2(pipe_fd[1], STDOUT_FILENO);
+ strcpy(filename, argv[0]);
+ strcat(filename, ".elf");
+
+ if (execv(filename, argv) == -1)
+ {
+ printf("%s: exec failed.\n", argv[0]);
+ exit(-1);
+ }
+ } else { // execution of the pipe
+ close(pipe_fd[1]);
+ dup2(pipe_fd[0], STDIN_FILENO);
+ strcpy(filename, argv2[0]);
+ strcat(filename, ".elf");
+
+ if (execv(filename, argv2) == -1)
+ {
+ printf("%s: exec failed.\n", argv2[0]);
+ exit(-1);
+ }
+ }
+ } else {
+ strcpy(filename, tokens[0]);
+ argv[0] = tokens[0];
- /* We are looking for an executable with .elf extension */
- strcat(filename, ".elf");
+ /* We are looking for an executable with .elf extension */
+ strcat(filename, ".elf");
- if (execv(filename, argv) == -1) {
- printf("%s: exec failed.\n", argv[0]);
- exit(-1);
+ if (execv(filename, argv) == -1)
+ {
+ printf("%s: exec failed.\n", argv[0]);
+ exit(-1);
+ }
}
-
} else { /* Execution in the parent */
waitpid(pid_child, NULL, 0);
--
2.42.0