1// minishell_v1.c
2// ๊ธฐ๋ณธ ์ ๊ตฌ์กฐ: ์ฝ๊ธฐ โ ํ์ฑ โ ์คํ โ ๋ฐ๋ณต
3// ์ปดํ์ผ: gcc -o minishell_v1 minishell_v1.c -Wall
4// ์คํ: ./minishell_v1
5
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <unistd.h>
10#include <sys/wait.h>
11
12#define MAX_INPUT 1024
13#define MAX_ARGS 64
14
15// ์
๋ ฅ์ ๊ณต๋ฐฑ์ผ๋ก ๋ถ๋ฆฌ
16int parse_input(char* input, char** args) {
17 int argc = 0;
18 char* token = strtok(input, " \t\n");
19
20 while (token != NULL && argc < MAX_ARGS - 1) {
21 args[argc++] = token;
22 token = strtok(NULL, " \t\n");
23 }
24 args[argc] = NULL;
25
26 return argc;
27}
28
29// ๋ช
๋ น์ด ์คํ
30void execute(char** args) {
31 pid_t pid = fork();
32
33 if (pid < 0) {
34 perror("fork ์คํจ");
35 return;
36 }
37
38 if (pid == 0) {
39 // ์์ ํ๋ก์ธ์ค: ๋ช
๋ น์ด ์คํ
40 execvp(args[0], args);
41 // execvp ์คํจ์
42 perror(args[0]);
43 exit(EXIT_FAILURE);
44 } else {
45 // ๋ถ๋ชจ ํ๋ก์ธ์ค: ์์ ์ข
๋ฃ ๋๊ธฐ
46 int status;
47 waitpid(pid, &status, 0);
48 }
49}
50
51int main(void) {
52 char input[MAX_INPUT];
53 char* args[MAX_ARGS];
54
55 printf("\n=== Mini Shell v1 ===\n");
56 printf("๊ธฐ๋ณธ ๋ช
๋ น์ด ์คํ ์\n");
57 printf("์ข
๋ฃ: exit ๋ช
๋ น์ด ๋๋ Ctrl+D\n\n");
58
59 while (1) {
60 // ํ๋กฌํํธ ์ถ๋ ฅ
61 printf("minish> ");
62 fflush(stdout);
63
64 // ์
๋ ฅ ์ฝ๊ธฐ
65 if (fgets(input, sizeof(input), stdin) == NULL) {
66 printf("\n");
67 break; // EOF (Ctrl+D)
68 }
69
70 // ๋น ์
๋ ฅ ๋ฌด์
71 if (input[0] == '\n') continue;
72
73 // ํ์ฑ
74 int argc = parse_input(input, args);
75 if (argc == 0) continue;
76
77 // exit ๋ช
๋ น์ด
78 if (strcmp(args[0], "exit") == 0) {
79 printf("์์ ์ข
๋ฃํฉ๋๋ค.\n");
80 break;
81 }
82
83 // ์คํ
84 execute(args);
85 }
86
87 return 0;
88}