Minishell (42 cursus)

Minishell


42 ์„œ์šธ์˜ ๊ณผ์ œ์ค‘ ํ•˜๋‚˜์ธ Minishell์„ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ •๋ฆฌํ•œ ๊ธ€.

๋ชฉํ‘œ๋Š” zsh์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์‰˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ.

file descriptor์— ๋Œ€ํ•œ ์ง€์‹์„ ๋งŽ์ด ๋ฐฐ์šฐ๊ฒŒ ๋œ๋‹ค.


Readline Library

minishell ๊ณผ์ œ์—์„œ๋Š” readline ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์‚ฌ์šฉ์„ ํ—ˆ๊ฐ€ํ•œ๋‹ค.

readline

char	*readline(const char *);

์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ณ  ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

EOF๋ฅผ ๋งŒ๋‚˜๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


add_history

int	add_history(const char *);

param์œผ๋กœ ๋“ค์–ด์˜จ ๋ฌธ์ž์—ด์„ history๋กœ ์ €์žฅํ•œ๋‹ค.

ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์—ด๋ฆฐ ์ƒํƒœ์—์„œ ํ‚ค๋ณด๋“œ ๋ฐฉํ–ฅํ‚ค ์œ„ ์•„๋ž˜๋ฅผ ํ†ตํ•ด ์ด์ œ๊ป ํ”„๋กฌํ”„ํŠธ์— ์ž…๋ ฅํ•œ ๋ฌธ์ž์—ด์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

Example

์Šคํƒ์ฒ˜๋Ÿผ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž์—ด๋ถ€ํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹.


rl_on_new_line

๋ผ์ธ์„ ์ถœ๋ ฅํ•œ ํ›„ ์ƒˆ ๋ผ์ธ(๋นˆ ๋ผ์ธ)์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๊ณ  ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์— ์•Œ๋ฆฐ๋‹ค.

๊ฐœํ–‰๋ฌธ์ž ์ถœ๋ ฅ ์ดํ›„์— ์ด์šฉ๋˜๋ฉฐ, ์ •์ƒ ์ˆ˜ํ–‰์‹œ 0, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


rl_replace_line

rl_line_buffer์˜ ๋‚ด์šฉ์„ text๋ผ๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พผ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํฌ์ธํŠธ์™€ ๋งˆํฌ๊ฐ€ ์œ ์ง€๋œ๋‹ค.

clear_undo๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ์ง€์ค‘์ธ undo_list๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

0์ด๋ฉด ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ , ์ด์™ธ์˜ ๊ฐ’์ด๋ผ๋ฉด ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.


rl_redisplay

ํ˜„์žฌ rl_line_buffer์˜ ์ปจํ…์ธ ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ํ˜„์žฌ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜์ง€ ์œ ์ง€์ค‘์ธ rl_line_buffer์˜ ๊ฐ’์„ ํ”„๋กฌํ”„ํŠธ์™€ ํ•จ๊ป˜ ์ถœ๋ ฅํ•œ๋‹ค.

์ด ๋•Œ ํ”„๋กฌํ”„ํŠธ ๊ฐ’์€ readline ํ•จ์ˆ˜์— ํ”„๋กฌํ”„ํŠธ๋กœ ์ค€ ๋ฌธ์ž์—ด๋กœ ์ด๋™ํ•œ๋‹ค.

์‹œ๊ทธ๋„์„ ๋ฐ›์•˜์„ ๋•Œ์˜ ์ƒํ™ฉ์—์„œ rl_redisplay๋ฅผ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

Simple example readline library


wait

์ž์‹ process๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋œ ๊ฒฝ์šฐ pid, ์‹คํŒจํ•œ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

statloc์˜ ์ฃผ์†Œ๋ฅผ ์ธ์ž๋กœ ๋„ฃ์–ด ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.


๊ธฐํƒ€ ํ—ˆ์šฉ ํ•จ์ˆ˜

printf, malloc, free, write, open, read, close, fork, wait, waitpid, wait3, wait4, signal, kill, exit, getcwd, chdir, stat, lstat, fstat, unlink, execve, dup, dup2, pipe, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs

waitpid

wait๊ณผ ๊ฐ™์ง€๋งŒ ์˜ต์…˜๊ณผ pid๋ฅผ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


wait3

์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, ์ข…๋ฃŒ๋œ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ์™€ ์ž์› ์‚ฌ์šฉ๋Ÿ‰์„ ์•Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜.


wait4

rusage

child process์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค.


signal

ํŠน์ • ์‹œ๊ทธ๋„์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ๋™์ž‘์„ ์ •์˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

์‹œ๊ทธ๋„ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด SIGKILL, SIGSTOP, SIGCONT ๋“ฑ์„ ์ œ์™ธํ•œ ํŠน์ • ์‹œ๊ทธ๋„์˜ ์ฒ˜๋ฆฌ ๋™์ž‘์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹œ๊ทธ๋„ ํƒ€์ž…์— ๋งž๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์„ฑ๊ณต ์‹œ ์ด์ „ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹คํŒจ์‹œ SIG_ERR์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Example


ํ•˜๋“œ๋งํฌ๋ฅผ ๋Š๋Š”๋ฐ ์ด์šฉํ•œ๋‹ค. ํ•˜๋“œ๋งํฌ์˜ ์ด๋ฆ„์„ ์‚ญ์ œํ•˜๋ฉด inode๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ํ•˜๋“œ๋งํฌ๋ฅผ ๋Š์–ด ๋งํฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ค„์ธ๋‹ค.

path์— ๋ช…์‹œ๋œ ํ•˜๋“œ๋งํฌ๋Š” ์‚ญ์ œ๊ฐ€ ๋˜์ง€๋งŒ ํ•ด๋‹น inode๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ํ•˜๋“œ ๋งํฌ๊ฐ€ ์ง€์›Œ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ํŒŒ์ผ์˜ ํ•˜๋“œ๋งํฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋ฉด ์—ฌ์ „ํžˆ ๊ทธ ํŒŒ์ผ์€ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

์ •์ƒ์ ์œผ๋กœ ํ•˜๋“œ๋งํฌ๋ฅผ ๋Š์œผ๋ฉด 0, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ•˜๋“œ๋งํฌ์˜ ์ฐธ์กฐ ๊ฐœ์ˆ˜๊ฐ€ 0์ด ๋˜๋ฉด ์‹ค์ œ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” disk space๋ฅผ freeํ•˜์—ฌ OS๊ฐ€ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.


execve

์ธ์ž๋กœ ๋ฐ›์€ ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ ์‹คํ–‰ํ•˜๊ณ  ์ •์ƒ ๋™์ž‘ํ•  ๊ฒฝ์šฐ 0, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


dup

fd๋ฅผ ๋ฐ›์•„์„œ ๋ณต์ œํ•œ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ๋ณต์ œํ•  ๊ฒฝ์šฐ fd๊ฐ’, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ -1 ๋ฐ˜ํ™˜.


dup2

dup2์™€ dup์€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์ด ๋™์ผํ•˜๋‹ค. ๋‹ค๋งŒ ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” fd2๋ผ๋Š” ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋„๋ก fd๋ผ๋Š” ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณต์ œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ •์ƒ ๋™์ž‘์˜ ๊ฒฝ์šฐ fd2๊ฐ€ fd๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” file descriptor๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ -1 ๋ฐ˜ํ™˜.


pipe

์„œ๋กœ ๋…๋ฆฝ๋œ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„ ๋ฐ ํŒŒ์ดํ”„์— ๋Œ€ํ•œ ๋‘ ๊ฐœ์˜ fd๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ํ•˜๋‚˜์˜ ํŒŒ์ดํ”„๋ฅผ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๊ณต์œ ํ•œ๋‹ค.

ํŒŒ์ดํ”„ ์ž์ฒด๋Š” fork()๋ฅผ ํ•˜๋”๋ผ๋„ ๋ณต์‚ฌ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฐฉํ–ฅ์„ฑ์ด ์—†๋‹ค.

fd[2]

ํฌ๊ธฐ๊ฐ€ 2์ธ intํ˜• ๋ฐฐ์—ด. fd[0]์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” fd๊ฐ€ ๋‹ด๊ธด๋‹ค. fd[1]์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” fd๊ฐ€ ๋‹ด๊ธด๋‹ค.

fd[0] = read, fd[1] = write


opendir

์ง€์ •ํ•œ ๋””๋ ‰ํ† ๋ฆฌ ์ŠคํŠธ๋ฆผ์„ ์—ฐ๋‹ค.

ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ.

์ •์ƒ์ ์œผ๋กœ ๋ฆฌํ„ด๋œ DIR ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  readdir()๊ณผ closedir()์„ ์‚ฌ์šฉ.

๋””๋ ‰ํ† ๋ฆฌ ์—ด๊ธฐ์— ์„ฑ๊ณตํ•˜๋ฉด ๋””๋ ‰ํ† ๋ฆฌ ์ •๋ณด ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด NULL์„ ๋ฐ˜ํ™˜.


readdir

opendir()๋กœ ์–ป์€ ๋””๋ ‰ํ† ๋ฆฌ ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ์ •๋ณด๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์ฝ๋Š”๋‹ค.

์—ฐ์†๋œ readdir()์„ ํ˜ธ์ถœํ•  ๋•Œ๋Š” ๊ทธ ๋ฆฌํ„ด ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.


closedir

DIR ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ๋””๋ ‰ํ† ๋ฆฌ ์ŠคํŠธ๋ฆผ์„ ๋‹ซ๋Š”๋‹ค.

์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋  ๊ฒฝ์šฐ 0์„ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜.


strerror

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ์–ป๋Š”๋‹ค.

errnum ๊ฐ’์„ ํ†ตํ•ด ๋ฐœ์ƒํ–ˆ๋˜ ์˜ค๋ฅ˜์— ๋งž๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ถœ๋ ฅ๋˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.


errno

์—๋Ÿฌ ๋ฐœ์ƒ์‹œ ๊ฐ’์„ ๋ฐ”๊พธ์–ด ํ•ด๋‹น ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ง„๋‹ค.


isatty

ํŒŒ์ผ ์ง€์ •์ž๊ฐ€ ํ„ฐ๋ฏธ๋„์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.

ํ„ฐ๋ฏธ๋„์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด 1, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


ttyname

ํ„ฐ๋ฏธ๋„ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

desc๊ฐ€ ํ„ฐ๋ฏธ๋„์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ํ„ฐ๋ฏธ๋„์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

static ํ˜•ํƒœ๋กœ ํ• ๋‹น๋˜์–ด ์žˆ์–ด ๋ฎ์–ด์“ฐ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ณ„๋„์˜ free()๊ฐ€ ํ•„์š”์—†๋‹ค.


ttyslot

ํ„ฐ๋ฏธ๋„์— ๋Œ€ํ•œ DB์˜ entry index๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฒฝ์šฐ ์ด์šฉํ•˜๊ณ  ์žˆ๋Š” ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ 0 ๋˜๋Š” -1์ด ๋ฐ˜ํ™˜๋œ๋‹ค.


ioctl

์ „ํ˜•์ ์ธ ์šด์˜์ฒด์ œ๋Š” 2๊ณ„์ธต์œผ๋กœ ๋‚˜๋‰œ๋‹ค. User Space(์‚ฌ์šฉ์ž ๋ชจ๋“œ)์™€ Kernel Space(์ปค๋„ ๋ชจ๋“œ).

User Space์— ์ƒ์ฃผํ•˜๋Š” Application์ด Kernel Space์— ์กด์žฌํ•˜๋Š” ์ž์›์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋• ์‹œ์Šคํ…œ ์ฝœ์„ ์ด์šฉํ•œ๋‹ค.

System Call Function์€ ๋‚ด๋ถ€์ ์œผ๋กœ System Call Vector์™€ ๋Œ€์‘๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, exit() ํ•จ์ˆ˜๋Š” System Call Vector Number : 1, write()ํ•จ์ˆ˜๋Š” System Call Vector Number 4 ์™€ ๊ฐ™๋‹ค.

์ „ํ˜•์ ์ธ ์šด์˜์ฒด์ œ์˜ ์ปค๋„์€ ์ˆ˜ ๋ฐฑ๊ฐœ์˜ System Call Vector๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

ioctl() ์‹œ์Šคํ…œ ์ฝœ์€ device driver์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜์ด๋‹ค.

What is device driver? ํ•˜๋“œ์›จ์–ด ์ฃผ๋ณ€ ์žฅ์น˜๋Š” ์ปค๋„ ์•ˆ์— ์ง์ ‘์ ์œผ๋กœ ์ฃผ์†Œ ์ง€์ •์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์žฅ์น˜์™€ ํ†ต์‹ ํ•˜๊ธธ ์›ํ•  ์ˆ˜ ์žˆ๋‹ค. (ํ•˜๋“œ์›จ์–ด ์žฅ์น˜์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ) ๊ทธ๋Ÿฐ๋ฐ ์ปค๋„ ๊ฐœ๋ฐœ์ž๋Š” ์–ด๋–ค ์žฅ์น˜๊ฐ€ ์ปค๋„ ์•ˆ์— ์ฃผ์†Œ๋ฅผ ํ• ๋‹น๋ฐ›์„์ง€, ๊ทธ ์žฅ์น˜์—๋Š” ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํ™•์žฅ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ์‹์œผ๋กœ ์ปค๋„์„ ์œ ์—ฐํ•˜๊ฒŒ ์„ค๊ณ„ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๊ณ , ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๋‚˜์˜จ๊ฒŒ device driver์ด๋‹ค. ์ฆ‰, ์–ด๋– ํ•œ ์žฅ์น˜๊ฐ€ ์—ฐ๊ฒฐ๋  ์ง€ ๋ชจ๋ฅด๋Š” ์ƒํ™ฉ์—์„œ device driver๋ผ๋Š” ํ•˜๋‚˜์˜ ์ค‘๊ฐ„ ๊ณ„์ธต์„ ๋‘ ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ioctl()ํ•จ์ˆ˜๋Š” ์žฅ์น˜์—๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ์‹œ์Šคํ…œ ์ฝœ์ด๋‹ค.

int fd๋Š” ์žฅ์น˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” fd๋กœ์จ, open์„ ํ†ตํ•ด ์–ป๋Š” fd๊ฐ€ ๋œ๋‹ค. (O_NONBLOCK flag ์ด์šฉ ๊ถŒ์žฅ)

unsigned long request๋Š” fd์— ํ•ด๋‹นํ•˜๋Š” ์žฅ์น˜์—๊ฒŒ ๋ณด๋‚ผ ๋ช…๋ น์ด๋‹ค. ์ด ๋ช…๋ น์— ๋”ฐ๋ผ์„œ ๋””๋ฐ”์ด์Šค๋ฅผ ์ปจํŠธ๋กค ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ํ•˜์— ์ด์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ioctl ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋งˆ์ง€๋ง‰ ์ธ์ž์—๋Š” char *ํƒ€์ž…์„ ์ด์šฉํ•œ๋‹ค.

์ •์ƒ ์ž‘๋™์‹œ 0, ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


getenv

name์— ํ•ด๋‹นํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜์˜ ๊ฐ’์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ์ฐพ์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


tcsetattr

file descriptor๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

ํ•จ์ˆ˜ ์ˆ˜ํ–‰์— ์„ฑ๊ณตํ•˜๋ฉด 0, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


tcgetattr

๊ธฐ๋กํ•  termios ๊ตฌ์กฐ์ฒด๋ฅผ ํฌ์ธํ„ฐ ํƒ€์ž…์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค. ํ•จ์ˆ˜ ์ˆ˜ํ–‰์— ์„ฑ๊ณตํ•˜๋ฉด 0, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


tgetent

TermCap์˜ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ๋ฃจํ‹ด์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ name์— ํ• ๋‹นํ•˜๋Š” ๊ฐ’์€ TERM ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ํ• ๋‹น๋œ ํ„ฐ๋ฏธ๋„ ํƒ€์ž…์„ ์ด์šฉํ•œ๋‹ค.

ํ•จ์ˆ˜ ์ˆ˜ํ–‰์— ์„ฑ๊ณตํ•˜๋ฉด 1, DB๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ์ง€๋งŒ TERM์„ ์œ„ํ•œ ๊ฐœ์ฒด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ 0, ๊ทธ ์™ธ์—๋Š” -1์„ ๋ฐ˜ํ™˜.

What is TermCap ?Termcap์€ Unix ๊ณ„์—ด ์ปดํ“จํ„ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋‹ค. minishell์—์„œ ๋ฐ˜๋“œ์‹œ ํ•œ ๋ฒˆ์ฏค์€ ๊ณต๋ถ€ํ•˜๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•˜๋Š” ๊ฐœ๋…!


tgetflag

์ฟผ๋ฆฌ๋กœ ์‚ฌ์šฉํ•  ์ด๋ฆ„์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ฟผ๋ฆฌ์˜ ๊ฒฝ์šฐ 1, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


tgetnum

์ฟผ๋ฆฌ๋กœ ์‚ฌ์šฉํ•  ์ด๋ฆ„์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

ํ•จ์ˆ˜ ์ˆ˜ํ–‰์— ์„ฑ๊ณตํ•˜๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด -1์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


tgetstr

์ฟผ๋ฆฌ๋กœ ์‚ฌ์šฉํ•  ์ด๋ฆ„์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

์ฟผ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” Escape Sequence๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


tgoto

๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •๋œ ๊ธฐ๋Šฅ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•œ๋‹ค. ์ถœ๋ ฅ์€ tputs๋กœ ์ „๋‹ฌ๋œ๋‹ค.

col๊ณผ row๋ฅผ ๊ณ ๋ คํ•œ Cursor Motion์˜ Escape Sequence๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•จ์ˆ˜ ์ˆ˜ํ–‰์— ์‹คํŒจํ•˜๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


tputs

Escape Sequence์— ๋Œ€ํ•œ ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋Š” ๋ฃจํ‹ด์ด๋‹ค.

tgetstr ๋˜๋Š” tgoto๋ฅผ ํ†ตํ•ด ์–ป์€ ๊ฐ’์„ str์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค.

affcnt์˜ ๊ฒฝ์šฐ ์˜ํ–ฅ์„ ๋ผ์น  ์ค„์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ, 1๋กœ ์ฃผ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ .

putc๋Š” ASCII ๋ฌธ์ž ๊ฐ’์„ ์ธ์ž๋กœ ๋ฐ›์•„ ํ‘œ์ค€ ์ถœ๋ ฅ์˜ ์“ฐ๊ธฐ ์ž‘์—…์œผ๋กœ ํ„ฐ๋ฏธ๋„์— ASCII ๋ฌธ์ž ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ํ•จ์ˆ˜.


getcwd

ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.

๊ฒฝ๋กœ๊ฐ€ ์ €์žฅ๋˜๋Š” buf๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ , buf๋Š” NULL๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๋ฉฐ ๊ธฐ๋ก์ด ์„ฑ๊ณต์ ์ด๋ฉด buf์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

buf์— NULL์„ ์ธ์ž๋กœ ํ•  ๊ฒฝ์šฐ size๋งŒํผ์˜ ํฌ๊ธฐ๋กœ malloc ํ›„ ํ•ด๋‹น ๊ณต๊ฐ„์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ๊ฒฝ์šฐ ๋™์  ํ• ๋‹น ๋ฐ›์€ ๊ณต๊ฐ„์— ๋Œ€ํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ free๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ NULL์ด ๋ฐ˜ํ™˜๋˜๋ฉฐ errno์— ์ƒ์„ธ ์˜ค๋ฅ˜ ๋‚ด์šฉ์ด ์ €์žฅ๋œ๋‹ค.


chdir

ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค.


stat

ํŒŒ์ผ์˜ ํฌ๊ธฐ, ํŒŒ์ผ์˜ ๊ถŒํ•œ, ํŒŒ์ผ์˜ ์ƒ์„ฑ์ผ์‹œ, ํŒŒ์ผ์˜ ์ตœ์ข… ๋ณ€๊ฒฝ์ผ ๋“ฑ, ํŒŒ์ผ์˜ ์ƒํƒœ๋‚˜ ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์–ป๋Š” ํ•จ์ˆ˜.

ํ•œ ๋งˆ๋””๋กœ ํŒŒ์ผ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ ˆ๋Œ€ ๊ฒฝ๋กœ path๋ฅผ ์ธ์ž๋กœ ๋ฐ›์œผ๋ฉฐ, path๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ํ†ต๊ณ„ํ•˜๊ณ  buf๋ฅผ ์ฑ„์šด๋‹ค.

ํ•จ์ˆ˜ ์‹คํ–‰ ์„ฑ๊ณต ์‹œ 0, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ -1 ๋ฐ˜ํ™˜.

Example


lstat

ํŒŒ์ผ ์ƒํƒœ(์ •๋ณด)๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ ˆ๋Œ€ ๊ฒฝ๋กœ path๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉฐ, ๊ฒฝ๋กœ๊ฐ€ ์‹ฌ๋ณผ๋ฆญ ๋งํฌ์ธ ๊ฒฝ์šฐ ๋งํฌ๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ํŒŒ์ผ์ด ์•„๋‹Œ ๋งํฌ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋กœ buf๋ฅผ ์ฑ„์šด๋‹ค.

ํ•จ์ˆ˜ ์‹คํ–‰ ์„ฑ๊ณต ์‹œ 0, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜.


fstat

ํŒŒ์ผ ์ƒํƒœ(์ •๋ณด)๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. fd๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ ํ†ต๊ณ„ํ•˜๊ณ  buf๋ฅผ ์ฑ„์šด๋‹ค.

ํ•จ์ˆ˜ ์‹คํ–‰ ์„ฑ๊ณต ์‹œ 0, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜.

Last updated