0922 - tamagoyakii/minishell GitHub Wiki

Parsing Part

ํŒŒ์‹ฑ ๋ฐฉ๋ฒ•

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€๊ฒฝ

๊ตฌ์กฐ์ฒด ์„ ์–ธ

  1. ํŒŒ์‹ฑ ๋‹จ๊ณ„์—์„œ ๊ตฌํ˜„ ๋‹จ๊ณ„๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๊ตฌ์กฐ์ฒด
typedef enum	e_redir_type
{
	INPUT,		/* > */
	OUTPUT, 	/* < */
	A_OUTPUT, 	/* >> */
	HEREDOC		/* << */
}		t_redir_type;

typedef struct	s_redir
{
	int		r_type; /* redirect : >, <, >> | heredoc : << */
	char		*value; /* redirect : filename | heredoc : endstr */
	struct s_redir	*next;
}		t_redir;

/* ๊ตฌํ˜„๋ถ€๋กœ ๋„˜๊น€ */
typedef struct	s_argv
{
	char		**cmd; /* execve()๊ฐ€ ์ด์ค‘ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— */
	struct s_redir	*in;
	struct s_redir	*out;
	struct s_argv	*next;
}		t_argv;
  1. ํ† ํฐ ๊ด€๋ จ ๊ตฌ์กฐ์ฒด
typedef enum	e_token_type
{
	WORD,
	REDIR,
	PIPE,
	NULL
}		t_token_type;

typedef struct	s_token
{
	int	t_type;
	char	*str;
}		t_token;
  1. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ตฌ์กฐ์ฒด
typedef struct	s_env
{
	char		*key;
	char		*value;
	struct s_env	*prev;
	struct s_env	*next;
}		t_env;

=> ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ์‚ฌ์šฉ

ํŒŒ์‹ฑ๋ถ€ ํ”Œ๋กœ์šฐ ์ฐจํŠธ ์ž‘์„ฑ

ํ”Œ๋กœ์šฐ ์ฐจํŠธ

๊ตฌ์ฒด์ ์ธ ๊ณ„ํš

  1. ์ดˆ๊ธฐํ™” // wochae
    1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ๋ฐ ์ €์žฅ
    2. ๊ตฌ์กฐ์ฒด ์ดˆ๊ธฐํ™”
  2. ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ฒ˜๋ฆฌ(Read Input) // wochae
    1. ๋ฌธ์ž์—ด ์ž…๋ ฅ
    2. ์ž…๋ ฅ๊ฐ’ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  3. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์น˜ํ™˜(Replace env) // wochae
    1. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์น˜ํ™˜
  4. ๋ฌธ์ž์—ด ๋ถ„ํ• (Split Line) // donghyuk
    1. ๋งจ ์•ž ๊ณต๋ฐฑ ์ œ๊ฑฐ
    2. quotes, double quotes ์ œ๊ฑฐ + unclosed ์—ฌ๋ถ€ ํ™•์ธ
    3. ์ด์ค‘ ๋ฐฐ์—ด ์ƒ์„ฑ
  5. ํ† ํฐ ์ƒ์„ฑ(Create token) // jihyukim
    1. ํ† ํฐ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ(type ์ •์˜, str ํ• ๋‹น)
    2. ํ† ํฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ(redirection, pipeline unclosed ์—ฌ๋ถ€ ํ™•์ธ)
  6. ์ธ์ž ์ƒ์„ฑ(Create Argvs) // jihyukim
    1. ํ† ํฐ์„ ์•Œ๋งž๊ฒŒ ํ• ๋‹น

ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค

  • wochae -> donghyuk : char *replace_env()
  • donghyuk -> jihyukim : char **split_input()

Execute Part

์‹คํ–‰ ์ ˆ์ฐจ

โ–ถ๏ธ argv๋ฅผ ๋ฐ›์Œ

โ–ถ๏ธ ํŒŒ์ดํ”„ ๊ฐœ์ˆ˜ == 0 && built-in ํ•จ์ˆ˜์ธ ๊ฒฝ์šฐ

  1. ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰
  2. ๋ฌด์Šจ ๋ช…๋ น์–ด์ธ์ง€ ๊ฒ€์‚ฌ(cmd[0] ํ™•์ธ)
  3. ์‹คํ–‰

โ–ถ๏ธ ์•„๋‹Œ ๊ฒฝ์šฐ, fork(); ํ›„ ์‹คํ–‰

  1. ํŒŒ์ดํ”„ ๊ฐœ์ˆ˜ ํ™•์ธ
  2. while ๋Œ๋ฉด์„œ ํŒŒ์ดํ”„ ๊ฐœ์ˆ˜๋งŒํผ ํŒŒ์ดํ”„ ํ•จ์ˆ˜ ์‹คํ–‰
  3. ํฌํฌ ์‹คํ–‰
    • ์ž์‹ ํ”„๋กœ์„ธ์Šค ์‹œ๊ทธ๋„ ์„ค์ • ํ•„์š”ํ•œ๊ฐ€? โ†’ ํ•„์š”ํ•˜๋‹ค
  4. ์•ˆ์“ฐ๋Š” fd ๋‹ซ์•„์ฃผ๊ธฐ
  5. ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋“ค์–ด๊ฐ€์„œ in, out ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ ํŒŒ์ผ ์ƒ์„ฑ
  6. ํŒŒ์ดํ”„์— ๋”ฐ๋ผ fd ์„ค์ •
    • ํŒŒ์ผ next๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ infile fd, outfile fd๋กœ ์„ค์ •
    • ํŒŒ์ผ next๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ fd close
  7. heredoc์€ ๋งˆ์ง€๋ง‰์ธ์ง€ ์•„๋‹Œ์ง€ ์ฒดํฌํ•ด์„œ ๋งˆ์ง€๋ง‰์ด๋ฉด ์ €์žฅํ•˜๊ณ  ์•„๋‹ˆ๋ฉด ๋ง๊ณ (์ž„์‹œํŒŒ์ผ ์ƒ์„ฑ์€ ๋งˆ์ง€๋ง‰์ผ ๋•Œ๋งŒ)
  8. ์‹คํ–‰ํ•˜๊ธฐ
  9. ํ”„๋กœ์„ธ์Šค ๊ธฐ๋‹ค๋ ค์„œ exit status ์„ค์ •
  10. ๋ฐ›์€ ์ธ์ž ํ”„๋ฆฌํ•ด์ฃผ๊ธฐ

todo

  1. single_builtin์ธ ๊ฒฝ์šฐ infile์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉด return์‹œ์ผœ์ฃผ๋Š” ๋ถ€๋ถ„
  2. heredoc ๋ถ€๋ถ„
  3. wait, exit status ๋ถ€๋ถ„
  4. free ํ•จ์ˆ˜๋“ค
  5. exceve ํ•จ์ˆ˜ PATH ์ฐพ๋Š” ๋ถ€๋ถ„
  6. builtin ํ•จ์ˆ˜ ์ „๋ถ€ ๋‹ค

๊ตฌ์ฒด์ ์ธ ๊ณ„ํš

  1. ์ฃผ๋ง ์ „๊นŒ์ง€
  • nheo : ์ „์ฒด์ ์ธ ํ๋ฆ„ ์ฝ”๋”ฉ
  • jabae : pipe ๊ณต๋ถ€, nheo ์ฝ”๋“œ ํ† ๋Œ€๋กœ ํ”Œ๋กœ์šฐ ์ฐจํŠธ ์งœ๊ธฐ
  1. ์ฃผ๋ง ๋™์•ˆ
  • built-in ํ•จ์ˆ˜ ๋‚˜๋ˆ ์„œ ๊ตฌํ˜„ํ•˜๊ธฐ
โš ๏ธ **GitHub.com Fallback** โš ๏ธ