minishell_v1.c

Download
c 89 lines 1.9 KB
 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}