From 14130caef7d4b74780e64a09dcf83f08482ce67e Mon Sep 17 00:00:00 2001 From: Hugo LAMY Date: Sun, 26 Jun 2022 18:03:13 +0200 Subject: [PATCH] execve and forks ok --- Makefile | 66 ++++++++++++++++++++++++++++++++++++++++++++ builds/microshell.o | Bin 0 -> 2808 bytes microshell | Bin 0 -> 16944 bytes microshell.c | 40 ++++++++++++++++++++++----- 4 files changed, 99 insertions(+), 7 deletions(-) create mode 100644 Makefile create mode 100644 builds/microshell.o create mode 100755 microshell diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ebdc0ab --- /dev/null +++ b/Makefile @@ -0,0 +1,66 @@ +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # +# . name = value \ . += append to a variable # +# VARIABLES . value . != set result of command # +# . name is case sensitive . ?= set if not already set # +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # + +NAME = microshell + +CC = gcc +EXT = c + +CFLAGS = -Wall -Wextra -Werror $(INCLUDES) + +VPATH = $(D_SRCS) + +LIBS = + +INCLUDES = -I$(D_HEADERS) + +D_SRCS = . +SRCS = microshell.c + +D_HEADERS = . +HEADERS = + +D_OBJS = builds +OBJS = $(SRCS:%.$(EXT)=$(D_OBJS)/%.o) + +RM_OBJS = rm -rf $(D_OBJS) + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # +# . target: prerequisites . $@ : target # +# RULES . recipe . $< : 1st prerequisite # +# . recipe . $^ : all prerequisites # +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # + +all: $(NAME) + +$(D_OBJS)/%.o: %.$(EXT) | $(D_OBJS) + $(CC) $(CFLAGS) -c $< -o $@ + +$(D_OBJS): + mkdir $@ + +$(OBJS): $(HEADERS:%=$(D_HEADERS)/%) + +$(NAME): $(OBJS) + $(CC) $(OBJS) -o $@ $(LIBS) + +leaks: $(NAME) + valgrind --leak-check=full --show-leak-kinds=all ./$(NAME) + +test: $(NAME) + ./microshell /bin/ls "|" /usr/bin/grep microshell ";" /bin/echo i love my microshell + +clean: + $(RM_OBJS) + +fclean: clean + rm -f $(NAME) + +re: fclean all + +.PHONY : all clean fclean re + diff --git a/builds/microshell.o b/builds/microshell.o new file mode 100644 index 0000000000000000000000000000000000000000..9e5e888977035d97ad375b44cf4f08592e5eb71a GIT binary patch literal 2808 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 M#?n~iGH|itU(L9&+yDRo literal 0 HcmV?d00001 diff --git a/microshell.c b/microshell.c index e691131..54d7b34 100644 --- a/microshell.c +++ b/microshell.c @@ -1,14 +1,20 @@ -#include // write -#include // printf -#include // strcmp +#include // write, fork, execve, pipe +#include // printf +#include // strcmp +#include // pid_t +#include // waitpid -void print_cmd(char **av, int end) +#define STDIN 0 +#define STDOUT 1 +#define STDERR 2 + +void print_cmd(char **av) { int i; int size; i = 0; - while (i < end) + while (av[i]) { size = 0; while (av[i][size] != '\0') @@ -20,7 +26,23 @@ void print_cmd(char **av, int end) write(1, "\n", 1); } -int main(int ac, char **av) +//void exec_cmd(char **av, int end, char **en) +void exec_cmd(char **av, char **en) +{ + pid_t pid = fork(); + +// av[end] = NULL; + if (pid == 0) // child process + { + execve(av[0], av, en); + } + else // parent process + { + waitpid(pid, NULL, 0); + } +} + +int main(int ac, char **av, char **en) { int i; int start; @@ -33,9 +55,13 @@ int main(int ac, char **av) start = i; while (i < ac && strcmp(av[i], "|") && strcmp(av[i], ";")) i++; - print_cmd(&av[start], i - start); + av[i] = NULL; +// print_cmd(&av[start]); + exec_cmd(&av[start], en); if (i < ac) i++; } return (0); } + +// https://www.rozmichelle.com/pipes-forks-dups/