Search
Duplicate
๐Ÿ’ก

minishell

Holy Graph
3Circle
๊ฐ„๋žตํ•œ ๋‚ด์šฉ
๋ฏธ๋‹ˆ์‰˜๋จน์œผ๋ฉด์„œ ๋ฏธ๋‹ˆ์‰˜ ํ•˜๊ธฐ..
์ ์ • ๊ธฐ๊ฐ„
210 hours
์ œ์ž‘์— ์ฐธ์—ฌํ•œ ์‚ฌ๋žŒ
์ง„ํ–‰ ์ค‘์ธ ์‚ฌ๋žŒ
์ตœ์ข… ํŽธ์ง‘์ผ
Jul 10
ํ†ต๊ณผํ•œ ์‚ฌ๋žŒ
1 more property
โ€ข
๋ฏธ๋‹ˆ์‰˜ ๋ง›์ž‡๋‹น
โ€ข
๋ฏธ๋‹ˆ์‰˜ ํ•˜๋Š” ์‚ฌ๋žŒ๋“คํ•œํ…Œ๋Š” ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฏธ๋‹ˆ์‰˜ ์ง€๊ธ‰ํ•ด์ค˜์•ผ๋จ. ๋‹น๋–จ์–ด์ง
โ†’ 222

0. Minishell subject!

Search
Mandatory part
์ด๋ฆ„
ํƒœ๊ทธ
readline, rl_on_new_line, rl_replace_line, rl_redisplay, add_history, printf, malloc, free, write, open, read, close, fork, wait, waitpid, wait3, wait4, signal, kill, exit, getcwd, chdir, stat, lstat, fstat, execve, dup, dup2, pipe, opendir, readdir, closedir, strerror, errno, isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs
Write a shell
COUNT5
โ€ข
์•ˆ๋‹ซํžŒ ' ์ด๋‚˜ " ๋Š” ํ•ฒ ํ•„์š” ์—†์Œ, \ ์ด๋‚˜ ; . ๊ฐ€ ์žˆ์œผ๋ฉด ์•ˆ๋จ
โ€ข
์ „์—ญ ๋ณ€์ˆ˜ 1๊ฐœ ๋งŒ ๊ฐ€๋Šฅ
โ€ข
์ƒˆ๋กœ์šด ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅ ๋ฐ›์„๋•Œ๋Š” prompt ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ๋Œ
โ€ข
History๊ฐ€ ๋ผ์•ผํ•จ
โ€ข
PATH ๋ณ€์ˆ˜๋‚˜, ์ƒ๋Œ€ ๊ฒฝ๋กœ, ์ ˆ๋Œ€ ๊ฒฝ๋กœ ์— ์žˆ๋Š”๊ฑธ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์‹คํ–‰ํ•ด์•ผํ•œ๋‹ค.
โ€ข
๊ตฌํ˜„ํ•ด์•ผํ•  builtin
โ—ฆ
echo (n ์˜ต์…˜)
โ—ฆ
cd (์ ˆ๋Œ€, ์ƒ๋Œ€ ๊ฒฝ๋กœ๋งŒ)
โ—ฆ
pwd
โ—ฆ
export
โ—ฆ
unset
โ—ฆ
env
โ—ฆ
exit
โ€ข
๋ฆฌ๋‹ค์ด๋ ‰์…˜ ๋˜์•ผํ•จ
โ€ข
ํŒŒ์ดํ”„ ์žˆ์–ด์•ผํ•จ
โ€ข
ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ž‘๋™ํ•ด์•ผํ•จ
โ€ข
$? ๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ ์‹คํ–‰๋œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ข…๋ฃŒ ๊ฐ’์ด ๋“ค์–ด๊ฐ€์•ผํ•จ
โ€ข
ctrl-C, ctrl-D, ctrl-\ ์ž‘๋™ํ•ด์•ผ๋Œ
โ—ฆ
ctrl-C : prompt ์ถœ๋ ฅ
โ—ฆ
ctrl-D : ์‰˜ ์ข…๋ฃŒ
โ—ฆ
ctrl-\ : ์•„๋ฌด๊ฒƒ๋„ ์•ˆํ•จ

์‹คํ–‰๋ถ€

โ€ข
builtin ํ•จ์ˆ˜๋ฅผ ์šฐ์„  ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.(mantatory์— ์žˆ๋Š” ํ•จ์ˆ˜๋“ค!)
โ€ข
๋๋‚˜๋ฉด ๋‚˜๋จธ์ง€ ๋ช…๋ น์–ด๋“ค์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก execve ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ช…๋ น์–ด ์œ„์น˜๋ฅผ ์ฐพ์•„์„œ ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค!
execve ํ•จ์ˆ˜ ์˜ˆ์ œ

ํŒŒ์‹ฑ

โ€ข
; ์—†์Œ
โ€ข
ํŒŒ์‹ฑํ•ด์„œ ๋ช…๋ น์–ด์™€ ์‹คํ–‰๋ฌธ์„ ๋„˜๊ฒจ์ฃผ์–ด์•ผํ•œ๋‹ค.

1. ํ•จ์ˆ˜ ์ •๋ฆฌํ•˜๊ธฐ!

์ด๋ฏธ ์•„๋Š” ํ•จ์ˆ˜

โ€ข
printf, malloc, free, write, open, read, close, exit

fork

function

forkํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค๋ฅผ ํ•˜๋‚˜ ํ˜ธ์ถœํ•œ๋‹ค.
์ด๋•Œ, ํ˜ธ์ถœํ•˜๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๊ฐ€์ง„๋‹ค.
๊ทธ๋ฆฌ๊ณ  forkํ•จ์ˆ˜ ํ˜ธ์ถœ ์ดํ›„ ๊ฐ์ž์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋œ๋‹ค.
#include <unistd.h> //header file pid_t fork(void);
C
๋ณต์‚ฌ

return value

โ€ข
์„ฑ๊ณต ์‹œ : ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID๊ฐ’, ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ๋Š” 0
โ€ข
์‹คํŒจ ์‹œ : -1

example

#include <stdio.h> #include <unistd.h> int main(void) { int x = 0; fork(); x = 1; printf("PID : %d, x : %d\n", getpid(), x); return (0); }
C
๋ณต์‚ฌ
$ ./a.out PID : 8270, x : 1 PID : 8271, x : 1
Shell
๋ณต์‚ฌ
๊ฒฐ๊ตญ x ์— ๊ฐ’์„ ๋Œ€์ž…ํ•  ๋•Œ, fork() ๋ช…๋ น ์ด์ „์— ๋Œ€์ž…ํ•˜๋‚˜ ์ดํ›„์— ๋Œ€์ž…ํ•˜๋‚˜ ์ƒ๊ด€์ด ์—†๋‹ค! fork๋ฅผ ํ•˜๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ€๋ชจ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ. ์ดํ›„ ๊ฐ™์€ ์ž‘์—…์„ ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐœ๋ณ„์ ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.
๋˜ํ•œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” fork()ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋•Œ getpid()์˜ return value๋Š” 0์ด๋‹ค. ๋”ฐ๋ผ์„œ getpid()์˜ return value๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž์‹์ธ์ง€ ๋ถ€๋ชจ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
#include <stdio.h> #include <unistd.h> int main(void) { pid_t pid; pid = fork(); if(pid > 0) // ๋ถ€๋ชจ ์ฝ”๋“œ printf("๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ์ž…๋‹ˆ๋‹ค."); else // ์ž์‹ ์ฝ”๋“œ printf("์ž์‹ ํ”„๋กœ์„ธ์Šค ์ž…๋‹ˆ๋‹ค."); return (0); }
C
๋ณต์‚ฌ

wait

function

1.
์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ž‘ ์ค‘์ด๋ฉด ์ƒํƒœ๋ฅผ ์–ป์–ด์˜ฌ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
2.
wait() ํ•จ์ˆ˜ ํ˜ธ์ถœ์ž๊ฐ€ ์‹œ๊ทธ๋„์„ย ๋ฐ›์„ย ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
3.
์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋œ ์ƒํƒœ๋ผ๋ฉด ์ฆ‰์‹œ ํ˜ธ์ถœ์ด ๋ฐ˜ํ™˜๋˜์–ด ์ƒํƒœ๋ฅผ ์–ป์Œ, ์ด ๋•Œ wait() ํ•จ์ˆ˜๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ํ”„๋กœ์„ธ์Šค ID๋ฅผ ๋ฐ˜ํ™˜
4.
์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†๋‹ค๋ฉด ํ˜ธ์ถœ์ด ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜๋ฉฐ, ์—๋Ÿฌ๊ฐ’์„ ๋ฐ˜ํ™˜
#include <sys/wait.h> pid_t wait(int *statloc);
C
๋ณต์‚ฌ
wait()์˜ ์ธ์ž status ๋ฅผ ํ†ตํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ,
์ž์‹ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๊ฐ’์€ ์ž์‹ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ๊ฐ’ *ย 256(FF) ์ด๋‹ค.

return value

โ€ข
์„ฑ๊ณต ์‹œ : PID
โ€ข
์‹คํŒจ ์‹œ : -1

example

#include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pidi; int status,i; pid = fork(); if (pid > 0) { pid_t waitpid; printf("๋ถ€๋ชจ PID : %d\n", getpid()); waitpid = wait(&status); // ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ ๋ฐ›์•„์˜ฌ ๋•Œ๊นŒ์ง€ wait! if (waitpid == -1) printf("error\n"); else { if (WIFEXITED(status)) printf("์ž์‹ ํ”„๋กœ์„ธ์Šค ์ •์ƒ ์ข…๋ฃŒ\n"); else if (WIFSIGNALED(status)) printf("์ž์‹ ํ”„๋กœ์„ธ์Šค ๋น„์ •์ƒ ์ข…๋ฃŒ: %d\n", WTERMSIG(status)); } } else if(pid == 0){ // ์ž์‹ ํ”„๋กœ์„ธ์Šค sleep(6); printf("์ž์‹ PID : %ld \n",(long)getpid()); } else { // fork ์‹คํŒจ perror("fork Fail! \n"); return (-1); } return (0); }
C
๋ณต์‚ฌ
$ ./a.out ๋ถ€๋ชจ PID : 10695 ์ž์‹ PID : 10696 ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ •์ƒ ์ข…๋ฃŒ
Shell
๋ณต์‚ฌ
wait ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ„์น˜์— ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค! ๋งŒ์•ฝ ์œ„ ์ฝ”๋“œ์—์„œ ๋ถ€๋ชจ pid๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์ด wait๋ช…๋ น์–ด ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค๋ฉด, ๋ถ€๋ชจ pid์ถœ๋ ฅ์ด ์ž์‹ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค.
wait()๊ด€๋ จ ํ•จ์ˆ˜์—์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ–ˆ๋˜ ๋ณ€์ˆ˜ status ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค! ๊ธฐ์กด์—๋Š” 255๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋น„๊ต ํ–ˆ์—ˆ์ง€๋งŒ ์•„๋ž˜ ๋งคํฌ๋กœ๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
Search
์ด๋ฆ„
ํƒœ๊ทธ
์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด TRUE
์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ๊ทธ๋„์— ์˜ํ•ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด TRUE
์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ๋‹ค๋ฉด TRUE
์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ •์ƒ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๋ฐ˜ํ™˜ํ•œ ๊ฐ’
์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋„๋กํ•œ ์‹ ํ˜ธ์˜ ๋ฒˆํ˜ธ ๋ฐ˜ํ™˜ (WIFSGNALED๊ฐ€ non
์ž์‹์„ ์ •์ง€ํ•˜๋„๋ก ์•ผ๊ธฐํ•œ ์‹ ํ˜ธ์˜ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜
COUNT6
WIF๋กœ ์‹œ์ž‘ํ•˜๋Š” macro๋Š” ์ƒ์œ„ ๋ฐ”์ดํŠธ์˜ ์ƒํƒœ๋ฅผ ํŒ๋‹จํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ ๋‚˜๋จธ์ง€ macroํ•จ์ˆ˜๋Š” ์ƒ์„ธ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜ค๋žœ ์‹œ๊ฐ„๋™์•ˆ ์‹คํ–‰์‹œํ‚ค๊ณ  ํ„ฐ๋ฏธ๋„์—์„œ kill๋ช…๋ น์œผ๋กœ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œ์ผœ๋ณด์ž!
$ kill -9 13439 ๋ถ€๋ชจ PID : 13438, ์ž์‹ PID : 13439 ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋น„์ •์ƒ ์ข…๋ฃŒ: 9
Shell
๋ณต์‚ฌ

waitpid

function

waitpid()๋Š” wait()ํ•จ์ˆ˜์™€ ๋™์ผํ•˜๊ฒŒ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ฐจ๋‹จ๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฐจ๋‹จ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
#include <sys/wait.h> //header file pid_t waitpid(pid_t pid, int *status, int options);
C
๋ณต์‚ฌ
โ€ข
pid : wait()ํ•  ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์œ ํ˜•
โ—ฆ
pid < -1 : ๊ทธ๋ฃนID๊ฐ€ ์ ˆ๋Œ€๊ฐ’๊ณผ ๊ฐ™์€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค
โ—ฆ
pid == -1 : ์•„๋ฌด ์ž์‹ ํ”„๋กœ์„ธ์Šค ID๋ผ๋„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค
โ—ฆ
pid == 0 : ์ž์‹ ๊ณผ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๊ทธ๋ฃน ID๋ฅผ ๊ฐ€์ง„ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
โ—ฆ
pid > 0 : ์ธ์ž๋กœ ๋„˜์–ด์˜จ pid๋ฅผ ๊ฐ€์ง„ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋งŒ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
โ€ข
status : wait()ํ•จ์ˆ˜์™€ ๋™์ผ
โ€ข
options : 0 ํ˜น์€ ์ƒ์ˆ˜์˜ ์กฐํ•ฉ์œผ๋กœ ์„ค์ •๋œ๋‹ค
โ—ฆ
0 : ๊ฒฐ๊ณผ๋ฅผ return ํ•  ๋–„๊นŒ์ง€ blockํ•œ๋‹ค
โ—ฆ
WNOHANG : ํ˜„์žฌ ์ข…๋ฃŒ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์œผ๋ฉด blockํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค
โ—ฆ
WUNTRACED : ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ STOPํ•˜๋ฉด ๋ฐ˜ํ™˜ํ•œ๋‹ค
โ—ฆ
WCONTINUED : STOP๋˜์—ˆ๋˜ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žฌ ์‹คํ–‰๋˜๋ฉด ๋ฐ˜ํ™˜ํ•œ๋‹ค

return value

โ€ข
์„ฑ๊ณต ์‹œ : PID โ†’ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค ID (status๊ฐ€ ์ƒํƒœ๊ฐ’ ์ €์žฅ)
โ€ข
์„ฑ๊ณต ์‹œ : 0 โ†’ option์ด WNUHANG์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—†์œผ๋ฉด 0์„ return
โ€ข
์‹คํŒจ ์‹œ : -1 โ†’ wait ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ, ์˜ค๋ฅ˜ ๋‚ด์šฉ์€ errno ์ „์—ญ๋ณ€์ˆ˜์— ์„ค์ •

example

#include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main() { pid_t pid; int status,i; pid = fork(); if (pid > 0) { pid_t waitpid; printf("๋ถ€๋ชจ PID : %d, ์ž์‹ PID : %d\n", getpid(), pid); } else if(pid == 0){ // ์ž์‹ ํ”„๋กœ์„ธ์Šค for (int i = 0 ; i < 3 ; ++i) sleep(1); printf("์ž์‹ PID : %ld \n",(long)getpid()); printf("์ž์‹ ์ข…๋ฃŒ\n"); } else { // fork ์‹คํŒจ perror("fork Fail! \n"); return -1; } pid = waitpid(pid, &status, 0); if (pid == -1 ) { printf("error\n"); } else { if (WIFEXITED(status)){ printf("ํ”„๋กœ๊ทธ๋žจ์—์„œ exited(%d) ๋˜๋Š” main์—์„œ return ;ํ•˜์—ฌ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("siganl %d๋ฒˆ์ด ๋ฐœ์ƒํ•˜์—ฌ ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\n", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("signal %d๋ฒˆ์œผ๋กœ ์ธํ•˜์—ฌ stop๋˜์—ˆ์Šต๋‹ˆ๋‹ค. \n", WSTOPSIG(status)); } else if (WIFCONTINUED(status)) { printf("stop๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค\n"); } } return 0; }
C
๋ณต์‚ฌ

wait3, wait4

function

wait3, wait4 ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž ์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
#include <sys/types.h> //header file #include <sys/wait.h> pid_t wait3(int *staloc, int options, struct rusage *rus); pid_t wait4(pid_t pid, int *staloc, int options, struct rusage *rus);
C
๋ณต์‚ฌ

parameters

โ€ข
staloc, options, pid : ์œ„์™€ ๋™์ผ
โ€ข
rusage : ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด๋‹ค. (struct rusage ํ˜•ํƒœ๋กœ ๋‹ด๊ธด๋‹ค)

return value

โ€ข
์„ฑ๊ณต ์‹œ : PID, ๋งŒ์•ฝ ํ•จ์ˆ˜๊ฐ€ WNOHANG ์˜ต์…˜์œผ๋กœ ์‹คํ–‰๋˜์—ˆ๊ณ , ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„์ง ์ข…๋ฃŒ๋˜์ง€ ์•Š์•˜์„ ๋•Œ, 0
โ€ข
์‹คํŒจ ์‹œ : -1

example

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/resource.h> void ViewRUsage(pid_t pid, struct rusage *pru); int main() { pid_t cpid = fork(); if(cpid == -1) { perror("error fork"); return 0; } if(cpid>0) { printf("<parent> fork child pid:%u\n",cpid); int rvalue = 0; struct rusage ru; pid_t wpid = wait3(&rvalue,0, &ru); ViewRUsage(wpid, &ru); } else { printf("<child> pid:%d \n",getpid()); int i=0,j=0; for(i=0;i<100000;i++) { fprintf(stderr,"."); } } return 0; } void ViewRUsage(pid_t pid, struct rusage *pru) { printf("\n=== pid rusage info ===\n"); struct timeval *tv = &(pru->ru_utime); printf("user CPU time used [%ld]sec [%d]usec\n", tv->tv_sec,tv->tv_usec ); tv = &(pru->ru_stime); printf("system CPU time used [%ld]sec [%d]usec\n", tv->tv_sec,tv->tv_usec ); }
C
๋ณต์‚ฌ

signal

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ๊ทธ๋„์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด
1. ์‹œ๊ทธ๋„์— ํ•ด๋‹น๋˜๋Š” ๊ธฐ๋ณธ ๋™์ž‘์„ ํ•˜๊ฑฐ๋‚˜
2. ๊ทธ ์‹œ๊ทธ๋„์„ ๋ฌด์‹œํ•˜๊ฑฐ๋‚˜
3. ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋™์ž‘ ๋ฐฉ์‹์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

function

์œ„์™€ ๊ฐ™์€ ์‹œ๊ทธ๋„์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜. signal๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•„์™€ ํ•ด๋‹น signal์—์„œ์˜ ํ–‰๋™์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
#include <signal.h> //header file void (*signal(int signum, void (*handler)(int)))(int);
C
๋ณต์‚ฌ

parameters

โ€ข
signum : ์‹œ๊ทธ๋„ ๋ฒˆํ˜ธ
โ€ข
(*handler)(int) : ์‹œ๊ทธ๋„์„ ์ฒ˜๋ฆฌํ•  ํ•ธ๋“ค๋Ÿฌ

return value

โ€ข
์„ฑ๊ณต ์‹œ : void *()(int); ์ด์ „์— ์„ค์ •๋œ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ
โ€ข
์‹คํŒจ ์‹œ : null(?)
์•„๋ž˜๋Š” MacOS์— ์ •์˜๋˜์–ด ์žˆ๋Š” Signal๋“ค์ด๋‹ค.
โ€ข
SIGKILL, SIGSTOP ๋“ฑ์€ ์ œ์–ดํ•  ์ˆ˜ ์—†๋‹ค.

example

#include <stdio.h> #include <signal.h> #include <unistd.h> void (*old_fun)(int); void sigint_handler(int signo) { printf("signo : %d", signo); printf("Ctrl-C ํ‚ค๋ฅผ ๋ˆ„๋ฅด์…จ์ฃ !!\n"); printf("๋˜ ๋ˆ„๋ฅด์‹œ๋ฉด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.\n"); signal(SIGINT, old_fun); //signal( SIGINT, SIG_DFL); } int main( void) { old_fun = signal(SIGINT, sigint_handler); // printf("asdf : %d", SIGTSTP); // printf("zxcv : %d", SIGCHLD); while (1) { printf("forum.falinux.com\n"); sleep(1); } }
C
๋ณต์‚ฌ

kill

function

ํ”„๋กœ์„ธ์Šค์— ์‹œ๊ทธ๋„์„ ์ „์†กํ•ด์ฃผ๋Š” ํ•จ์ˆ˜. ์‹œ๊ทธ๋„ SIGKILL์„ ๋ณด๋‚ด๋ฉด ์‰˜์˜ kill๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.
#include <signal.h> //header file int kill(pid_t pid, int signo)
C
๋ณต์‚ฌ

parameters

โ€ข
pid, signo : ์œ„์™€ ๋™์ผ

return value

โ€ข
์„ฑ๊ณต ์‹œ : 0
โ€ข
์‹คํŒจ ์‹œ : -1

getcwd

function

ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค
#include <unistd.h> //header file char *getcwd(char *buf, size_t size);
C
๋ณต์‚ฌ

parameters

โ€ข
buf : ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ €์žฅํ•  buffer. ๋งŒ์•ฝ buffer๊ฐ€ null์ด๋ฉด malloc์„ ํ†ตํ•ด์„œ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด free๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
โ€ข
size : buffer์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ

return value

โ€ข
์„ฑ๊ณต ์‹œ : ํฌ์ธํ„ฐ
โ€ข
์‹คํŒจ ์‹œ : null (์˜ค๋ฅ˜ ๋‚ด์šฉ์€ errno์— ์ €์žฅ๋œ๋‹ค)

example

#include <unistd.h> #include <stdio.h> #include <limits.h> int main() { char cwd[PATH_MAX]; if (getcwd(cwd, sizeof(cwd)) != NULL) { printf("Current working dir: %s\n", cwd); } else { perror("getcwd() error"); return 1; } return 0; }
C
๋ณต์‚ฌ

chdir

function

์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ํด๋” ๋ณ€๊ฒฝํ•˜๊ธฐ (cd in linux)
// man 2 chdir #include <unistd.h> //header file int chdir(const char *dirname);
C
๋ณต์‚ฌ

return value

โ€ข
์„ฑ๊ณต ์‹œ : 0
โ€ข
์‹คํŒจ ์‹œ : -1

example

#include <stdio.h> #include <limits.h> #include <unistd.h> // chdir header int main(void) { char buffer[PATH_MAX] = { 0, }; char changeDir[PATH_MAX] = { "/Users/42seoul/minishell/" }; int result = chdir(changeDir); if(result == 0) printf("Success\n"); else perror("Fail...\n"); return 0; }
C
๋ณต์‚ฌ

stat

function

ํŒŒ์ผ์˜ ํฌ๊ธฐ, ๊ถŒํ•œ, ์ƒ์„ฑ์ผ์‹œ, ์ตœ์ข… ๋ณ€๊ฒฝ์ผ ๋“ฑ ํŒŒ์ผ์˜ ์ƒํƒœ๋‚˜ ์ •๋ณด๋ฅผ ์–ป๋Š” ํ•จ์ˆ˜์ด๋‹ค.
stat(2) ํ•จ์ˆ˜๋Š” symbolic link์ธ ํŒŒ์ผ์„ path๋กœ ๋„˜๊ธฐ๋ฉด ๊ทธ ์›๋ณธ ํŒŒ์ผ์˜ย ์ •๋ณด๋ฅผ ์–ป๋Š”๋‹ค.
// man 2 stat #include <sys/stat.h> //header file int stat(const char *path, struct stat *buf);
C
๋ณต์‚ฌ

parameters

โ€ข
path : ํŒŒ์ผ ๋ช… ๋˜๋Š” ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ๋Œ€๊ฒฝ๋กœ/์ ˆ๋Œ€๊ฒฝ๋กœ
โ€ข
buf : ํŒŒ์ผ์˜ ์ƒํƒœ ๋ฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๊ตฌ์กฐ์ฒด
struct stat { dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; off_t st_size; blksize_t st_blksize; blkcnt_t st_blocks; time_t st_atime; tiem_t st_mtime; time_t st_ctime; };
C
๋ณต์‚ฌ

return value

โ€ข
์„ฑ๊ณต ์‹œ : 0
โ€ข
์‹คํŒจ ์‹œ : -1

example

์ƒ์„ธ ์˜ˆ์‹œ๋Š” ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๊ฐ€๋ฉด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

lstat, fstat

#include <unistd.h> int lstat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf);
C
๋ณต์‚ฌ
โ€ข
lstat : symbolic link์ธ ํŒŒ์ผ ์ž์ฒด์˜ ์ •๋ณด๋ฅผ ์–ป๋Š”๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๊ฐ™๋‹ค.
โ€ข
fstat : ์ธ์ž๋กœ ๊ฐ€์ ธ์˜จ fd(์—ด๋ ค์žˆ๋Š” file)์˜ ์ •๋ณด๋ฅผ ์–ป์–ด์˜จ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ๊ฐ™๋‹ค.

execve

function

์‹คํ–‰๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์ธ filename์˜ ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์— ์ ์žฌํ•˜์—ฌ ๊ธฐ์กด์˜ ์‹คํ–‰ ์ฝ”๋“œ์™€ ๊ต์ฒดํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.ย ย ์ฆ‰, ํ˜„์žฌ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋Šฅ์€ ์—†์–ด์ง€๊ณ  filename ํ”„๋กœ๊ทธ๋žจ์„ ๋ฉ”๋ชจ๋ฆฌ์— Loadingํ•˜์—ฌ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‹คํ–‰ํ•œ๋‹ค.
#include <unistd.h> //header file int execve(const char *filename, char *const argv[], char *const envp[]);
C
๋ณต์‚ฌ

parameters

โ€ข
filename : ๊ต์ฒดํ•  ์‹คํ–‰ ํŒŒ์ผ / ๋ช…๋ น์–ด. path์™€ ๋ช…๋ น์–ด๊ฐ€ ํ•ฉ์ณ์ง„ ํ˜•ํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•จ
ex) "usr/bin/ls"
โ€ข
argv : execve์—๋Š” argc๊ฐ€ ์—†์œผ๋ฏ€๋กœ array์˜ ๋งˆ์ง€๋ง‰ ์›์†Œ ๋‹ค์Œ์€ NULL์ด ์žˆ๋‹ค
โ€ข
envp : key = value ํ˜•ํƒœ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ฌธ์ž์—ด ๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ. ๋งˆ์ง€๋ง‰์€ NULL. ๋งŒ์•ฝ ์ด๋ฏธ ์„ค์ •๋œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด environ ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•œ๋‹ค.

return value

โ€ข
์„ฑ๊ณต ์‹œ : ์—†์Œ (์ด๋ฏธ ์ง€์ •๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ๋กœ์ง์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— return์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค)
โ€ข
์‹คํŒจ ์‹œ : -1
๋ช…๋ น์–ด ์œ„์น˜๋ฅผ ์ฐพ์•„๋ณด์ž which "๋ช…๋ น์–ด" โ†’ ๋งŒ์•ฝ alias๊ฐ€ ๋˜์–ด ์žˆ์œผ๋ฉด ํ•ด์ œํ•˜๊ณ  ํ™•์ธ ํ•ด์•ผ ํ•œ๋‹ค.

example

#include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <errno.h> extern char **environ; int main(int argc, char *argv[], char **envp) { char **new_argv; char command[] = "ls"; int idx; new_argv = malloc(sizeof(char *) * argc + 1); // ๋ช…๋ น์–ด๋ฅผ ls๋กœ ๋ณ€๊ฒฝ new_argv[0] = command; // command line์œผ๋กœ ๋„˜์–ด์˜จ parameter๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ for (idx = 1 ; idx < argc ; ++idx) new_argv[idx] = argv[idx]; // argc๋ฅผ execve ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ „๋‹ฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— NULL์„ ๋์œผ๋กœ ์ง€์ •ํ•ด์šฐ์ €์•ผ ํ•จ new_argv[argc] = NULL; if (execve("/bin/ls", new_argv, environ) == -1){ fprintf(stderr, "ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ error: %s\n", strerror(errno)); return 1; } printf("์ดํ›„ ๋กœ์ง์€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค..\n"); return (0); }
C
๋ณต์‚ฌ

dup

function

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณต์ œํ•˜์—ฌ ๋‹ค๋ฅธ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ์ƒ์„ฑ
#include <unistd.h> //header file int dup(int file_des);
C
๋ณต์‚ฌ

parameters

โ€ข
file_des : ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

return value

โ€ข
์„ฑ๊ณต ์‹œ : ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ
โ€ข
์‹คํŒจ ์‹œ : -1

example

#include <unistd.h> // dup header file #include <fcntl.h> #include <stdio.h> #include <stdlib.h> int main(void) { int fd1, fd2; if ((fd1 = open("file_1.txt", O_RDONLY)) < 0) { printf("file open error\n"); exit(0); } fd2 = dup(fd1); printf("fd1 : %d, fd2 : %d\n", fd1, fd2); close(fd1); close(fd2); return (0); }
C
๋ณต์‚ฌ
โ€ข
ํ•ญ์ƒ ๋‚ฎ์€ ์„œ์ˆ ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•จ

dup2

function

fd2 ์— ๊ธฐ์กด์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ณต์ œ.
๋งŒ์ผ fd2๊ฐ€ ์ด๋ฏธ ์—ด๋ ค์žˆ์œผ๋ฉด fd2๋ฅผ ๋‹ซ์€ ํ›„ ๋ณต์ œ.
#include <unistd.h> //header file int dup2(int file_des1, int file_des2);
C
๋ณต์‚ฌ

parameters

โ€ข
file_des : ๊ธฐ์กด์˜ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ
โ€ข
file_des2 : ์ƒˆ๋กœ์šด ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ

return value

โ€ข
์„ฑ๊ณต ์‹œ : -1 ์ด์™ธ์˜ ๊ฐ’
โ€ข
์‹คํŒจ ์‹œ : -1

example

int main(void) { int fd; if ((fd = open("file_1.txt", O_RDONLY)) < 0){ printf("file open error\n"); exit(0); } +- /* ํ‘œ์ค€ ์ถœ๋ ฅ์„ file_1.txt ํŒŒ์ผ๋กœ redirection ํ•จ */ dup2(fd, 1); /* ํ‘œ์ค€ ์˜ค๋ฅ˜๋ฅผ file_1.txt ํŒŒ์ผ๋กœ redirection ํ•จ */ dup2(fd, 2); close(fd); return (1); }
C
๋ณต์‚ฌ

pipe

function

์„œ๋กœ ๋…๋ฆฝ๋œ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.
#include <unistd.h> //header file int pipe(int fd[2]);
C
๋ณต์‚ฌ

parameters

โ€ข
fd[0] : ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„ fd[0]์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” fd๊ฐ€ ๋‹ด๊น€(ํŒŒ์ดํ”„ ์ถœ๊ตฌ)
โ€ข
fd[1] : ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„ fd[1]์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” fd๊ฐ€ ๋‹ด๊น€(ํŒŒ์ดํ”„ ์ž…๊ตฌ)

return value

โ€ข
์„ฑ๊ณต ์‹œ : 0
โ€ข
์‹คํŒจ ์‹œ : -1

example

#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> int pipes[2] ; void parent_proc() { char * buf = 0x0; ssize_t s; size_t len = 0; // ์ฝ๊ธฐ์šฉ ํŒŒ์ดํ”„๋ฅผ ๋‹ซ๋Š”๋‹ค close(pipes[0]); while ((s = getline(&buf, &len, stdin)) != -1) { buf[s - 1] = 0x0; ssize_t sent = 0; char * data = buf; while (sent < s) { sent += write(pipes[1], buf + sent, s - sent); } free(buf); buf = 0x0; len = 0; } close(pipes[1]); } void child_proc() { char buf[32]; ssize_t s; // ์“ฐ๊ธฐ์šฉ ํŒŒ์ดํ”„๋ฅผ ๋‹ซ๋Š”๋‹ค close(pipes[1]); while ((s = read(pipes[0], buf, 31)) > 0) { buf[s + 1] = 0x0; printf(">%s\n", buf); } exit(0); } int main() { pid_t child_pid; int exit_code; if (pipe(pipes) != 0) { perror("Error"); exit(1); } printf("%d %d\n", pipes[0], pipes[1]); child_pid = fork(); if (child_pid == 0) child_proc(); else parent_proc(); return (0); }
C
๋ณต์‚ฌ

opendir

function

๋””๋ ‰ํ† ๋ฆฌ ์—ด๊ธฐ
#include <dirent.h> // header file DIR * opendir(const char * name);
C
๋ณต์‚ฌ

parameters

โ€ข
name : open ํ•  ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ด๋ฆ„

return value

โ€ข
์„ฑ๊ณต ์‹œ : DIR ํฌ์ธํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ ์ •๋ณด ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ
โ€ข
์‹คํŒจ ์‹œ : NULL

readdir

function

๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ ์ •๋ณด ๊ตฌํ•˜๊ธฐ
#include <dirent.h> // header file struct dirent *readdir(DIR *dirp);
C
๋ณต์‚ฌ

parameters

โ€ข
dirp : open ํ• ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” DIR ํฌ์ธํ„ฐ

return value

โ€ข
์„ฑ๊ณต ์‹œ : ๋””๋ ‰ํ† ๋ฆฌ๋‚ด์˜ ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ
โ€ข
์‹คํŒจ ์‹œ : NULL
โ€ข
readdir()์„ ์ฒ˜์Œ ํ˜ธ์ถœํ•˜๋ฉด opendir()๋ฅผ ํ†ตํ•ด ์—ฐ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ ์ฒซ๋ฒˆ์งธ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๋‹ค์‹œ ํ˜ธ์ถœ์‹œ ๋‘๋ฒˆ์งธ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ •๋ณด, ๋‹ค์‹œ ํ˜ธ์ถœ์‹œ ์„ธ๋ฒˆ์งธ ํŒŒ์ผ์„ ํ˜ธ์ถœ,,, ํ•˜๋‹ค๊ฐ€ ๋”์ด์ƒ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด NULL ๋ฐ˜ํ™˜

closedir

function

๋””๋ ‰ํ† ๋ฆฌ ๋‹ซ๊ธฐ
#include <dirent.h> // header file int closedir(DIR *dirp);
C
๋ณต์‚ฌ

parameters

โ€ข
dirp : open ํ• ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” DIR ํฌ์ธํ„ฐ

return value

โ€ข
์„ฑ๊ณต ์‹œ : 0
โ€ข
์‹คํŒจ ์‹œ : -1

example (opendir/readdir/closedir)

#include <dirent.h> #include <stdio.h> #include <unistd.h> #include <sys/stat.h> int main() { DIR *dir_info; struct dirent *dir_entry; mkdir("test_A", 0755); // ์‹คํ–‰ํŒŒ์ผ์ด ์žˆ๋Š” ๊ณณ์— dir ์ƒ์„ฑ mkdir("test_B", 0755); dir_info = opendir("."); // ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ์—ด๊ธฐ if (dir_info) { while((dir_entry = readdir(dir_info))) // ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ ์ถœ๋ ฅ printf("%s\n", dir_entry->d_name); // d_name : ์ฝํžŒ ๋””๋ ‰ํ† ๋ฆฌ/ํŒŒ์ผ์˜ ์ด๋ฆ„ ์ €์žฅ closedir(dir_info); } return (0); }
C
๋ณต์‚ฌ

strerror

function

์‹œ์Šคํ…œ ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.
#include <string.h> char *strerror(int errnum);
C
๋ณต์‚ฌ

parameters

โ€ข
errnum : ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ

return value

โ€ข
์„ฑ๊ณต ์‹œ : ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ์™€ ์ผ์น˜ํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€ ๋ฌธ์ž์—ด
โ€ข
์‹คํŒจ ์‹œ : NULL or "Unknown error nnn"

example

#include <errno.h> #include <string.h> #include <stdio.h> int main(int argc, char **argv) { FILE *fp; if ((fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "errno[%d] : %s\n", errno, strerror(errno)); return (1); } return (0); }
C
๋ณต์‚ฌ

errno

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ ๋ฒˆํ˜ธ
#include <errno.h> extern int errno;
C
๋ณต์‚ฌ

isatty

function

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์€
#include <unistd.h> int isatty(int fildes);
C
๋ณต์‚ฌ

parameters

โ€ข
fildes : fd, ํŒŒ์ผ๋””์Šคํฌ๋ฆฝํ„ฐ

return value

โ€ข
์„ฑ๊ณต ์‹œ : 1 (ํ„ฐ๋ฏธ๋„์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ)
โ€ข
์‹คํŒจ ์‹œ : 0

example

์ฝ”๋“œ ์‹คํ–‰ ์ „ ํ˜„์žฌ pc์— ์–ด๋–ค ttyํŒŒ์ผ๋“ค์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž
$ cd /dev $ ls
C
๋ณต์‚ฌ
tty(teletypewriter) ๋ฆฌ๋ˆ…์Šค ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ธŒ ์ค‘์—์„œ ์ฝ˜์†”์ด๋‚˜ ํ„ฐ๋ฏธ๋„์„ ์˜๋ฏธ
#include <stdio.h> #include <unistd.h> #include <fcntl.h> int main() { int fd; printf("%d\n", isatty(0)); fd = open("/dev/ttyp0",O_RDONLY); printf("fd : %d, %d\n", fd, isatty(fd)); return (0); }
C
๋ณต์‚ฌ

ttyname

function

fd์— ๋Œ€ํ•œ ํ„ฐ๋ฏธ๋„ ์ด๋ฆ„์„ ์–ป์–ด์˜จ๋‹ค.
#include <unistd.h> char *ttyname(int desc);
C
๋ณต์‚ฌ

parameters

โ€ข
desc : fd

return value

โ€ข
์„ฑ๊ณต ์‹œ : ํ„ฐ๋ฏธ๋„ ์ด๋ฆ„, ์—†์œผ๋ฉด "(null)"
โ€ข
์‹คํŒจ ์‹œ : NULL

example

#include <unistd.h> #include <stdio.h> int main(void) { printf("your tty name is : %s\n", ttyname(0)); printf("your tty name is : %s\n", ttyname(1)); printf("your tty name is : %s\n", ttyname(2)); return (0); }
C
๋ณต์‚ฌ
โžœ funcStudy git:(main) โœ— ./a.out your tty name is : /dev/ttys008 your tty name is : /dev/ttys008 your tty name is : /dev/ttys008
Shell
๋ณต์‚ฌ

ttyslot

function

ttyslot - find the slot of the current user's terminal in somefile
#include <unistd.h> int ttyslot(void);
C
๋ณต์‚ฌ

return value

โ€ข
์„ฑ๊ณต ์‹œ : slot number
โ€ข
์‹คํŒจ ์‹œ : 0, -1

example

C
๋ณต์‚ฌ
โ€ข
ioctl
โ€ข
getenv
โ€ข
tcsetattr
โ€ข
tcgetattr

tgetent

function

์ปค์„œ ์ œ์–ด๋ฅผ ์œ„ํ•ด์„œ๋Š” termcap ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ์œ„ํ•œ ์„ธํŒ…์€ tgetent() ํ•จ์ˆ˜๋กœ ์‹œ์ž‘๋œ๋‹ค.
termcap ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ์‹œ -lncurses ์˜ต์…˜์„ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
#include <curses.h> #include <term.h> int tgetent(char *bp, const char *name);
C
๋ณต์‚ฌ

parameters

โ€ข
bp : ๋ฒ„ํผ ํฌ์ธํ„ฐ
โ€ข
name : ๋ฃจํ‹ด์ด๋ฆ„(?)

return value

โ€ข
์„ฑ๊ณต ์‹œ : 1
โ€ข
ํ•ด๋‹นํ•ญ๋ชฉ์ด ์—†์„ ๊ฒฝ์šฐ : 0
โ€ข
terminfo ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ : -1

example

#include <termcap.h> char *env = getenv("TERM"); //TERM ์„ค์ •์„ ๊ฐ€์ ธ์˜ด if (env == NULL) env = "xterm"; //๋Œ€๋ถ€๋ถ„ ๊ธฐ๋ณธ๊ฐ’์€ xterm tgetent(NULL, env); // xterm ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ดˆ๊ธฐํ™” char *cm = tgetstr("cm", NULL); // cursor motion char *ce = tgetstr("ce", NULL); // ํ˜„์žฌ ์ปค์„œ ์œ„์น˜์—์„œ ํ•œ ์ค„์˜ ๋๊นŒ์ง€ ์ง€์šฐ๊ธฐ
C
๋ณต์‚ฌ

tgetflag

function

??
#include <curses.h> int tgetflag(char id[2]);
C
๋ณต์‚ฌ

parameters

โ€ข
id : ??

return value

โ€ข
์„ฑ๊ณต ์‹œ : the boolean entry for id
โ€ข
์‹คํŒจ ์‹œ : 0

tgetnum

function

??
#include <curses.h> int tgetnum(char id[2]);
C
๋ณต์‚ฌ

parameters

โ€ข
id : ??

return value

โ€ข
์„ฑ๊ณต ์‹œ : the numeric entry for id
โ€ข
์‹คํŒจ ์‹œ : -1

tgetstr

function

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฃจํ‹ด์„ ๊ฐ€์ ธ์˜ด
#include <curses.h> char *tgetstr(char id[2], char **area);
C
๋ณต์‚ฌ

parameters

โ€ข
id : ??
โ€ข
area : ??

return value

โ€ข
์„ฑ๊ณต ์‹œ : the string entry for id
โ€ข
์‹คํŒจ ์‹œ : 0

tgoto

function

๋™์ž‘ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ช…๋ น์„ ๋ฐ›๊ธฐ
#include <curses.h> char *tgoto(char *cap,int col,int row);
C
๋ณต์‚ฌ

parameters

โ€ข
cap : ๋ช…๋ น์–ด
โ€ข
col : ์ด๋™ํ•  ํ–‰
โ€ข
row : ์ด๋™ํ•  ์—ด

return value

โ€ข
์„ฑ๊ณต ์‹œ : ??
โ€ข
์‹คํŒจ ์‹œ : ??

example

// (5, 5) ์œ„์น˜๋กœ ์ปค์„œ๋ฅผ ์˜ฎ๊ธฐ๊ธฐ // ํ„ฐ๋ฏธ๋„ ์ฐฝ์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์œ„๊ฐ€ (0, 0) #include <unistd.h> #include <termcap.h> int putchar_tc(int tc) { write(1, &tc, 1); return (0); } int main(void) { tgetent(NULL, "xterm"); char *cm = tgetstr("cm", NULL); tputs(tgoto(cm, 5, 5), 1, putchar_tc); // (5, 5) ์œ„์น˜๋กœ ์ด๋™ํ•˜๋Š”(cm - cursor motion) ๋ช…๋ น์„ tputs์— ์ „๋‹ฌํ•˜์—ฌ ์‹คํ–‰ } // ce ๋ช…๋ น์˜ ๊ฒฝ์šฐ tgoto ์—†์ด ๋ฐ”๋กœ tputs(ce, 1, putchar_tc)์˜ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค. // ์˜ˆ์‹œ : tputs์— ์žˆ์Œ
C
๋ณต์‚ฌ

tputs

function

๋™์ž‘ ์‹คํ–‰ ํ•˜๊ธฐ
#include <curses.h> int tputs(const char *str, int affcnt, int (*putc)(int));
C
๋ณต์‚ฌ

parameters

โ€ข
str : ??
โ€ข
affcnt : ??
โ€ข
putc : ??

return value

โ€ข
์„ฑ๊ณต ์‹œ : ??
โ€ข
์‹คํŒจ ์‹œ : ??

example

// ce - clear line from cursor ๋ช…๋ น #include <unistd.h> #include <termcap.h> int putchar_tc(int tc) { write(1, &tc, 1); return (0); } int main(void) { tgetent(NULL, "xterm"); char *cm = tgetstr("cm", NULL); tputs(ce, 1, putchar_tc); }
C
๋ณต์‚ฌ

2. ๋ช…๋ น์–ด ์ •๋ฆฌํ•˜๊ธฐ!

echo (-n ์˜ต์…˜)

โ€ข
C์–ธ์–ด์—์„œ์˜ printf ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•จ.
1) ์˜ต์…˜ ์—†์ด โ†’ ์—์ฝ” ํ›„ ๊ฐœํ–‰์ถœ๋ ฅ
โ†’ \ ๋ฅผ ๋งŒ๋‚˜๋„ ํŠน๋ณ„ํ•˜๊ฒŒ ํ•ด์„ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ
2) -n ์˜ต์…˜ย โ†’ ์—์ฝ” ํ›„ ๊ฐœํ–‰ํ•˜์ง€ ์•Š์Œ
testcase โ†’ ๋ฌด์กฐ๊ฑด ๋Œ๋ ค๋ณผ ๊ฒƒ...
echo echo hello echo -n hello echo hello -n echo -nnn hello echo -n-n hello echo -nnn hello -n echo -nnn -n hello echo - echo - - echo -- echo -n -n -nhjk hello echo -n -n -n -n -n hello echo "hello World" echo "hello World" echo \\\"\'''\"
Plain Text
๋ณต์‚ฌ

cd (์ƒ๋Œ€๊ฒฝ๋กœ ๋˜๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ๋งŒ)

โ€ข
"change directory"์˜ ์•ฝ์ž๋กœ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ.
cd ๋’ค์— ๊ฐ€๊ณ  ์‹ถ์€ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅ.
cd / : ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ (์ ˆ๋Œ€ ๊ฒฝ๋กœ)
cd /home/pi : /home/pi ๋กœ ์ด๋™ (์ƒ๋Œ€ ๊ฒฝ๋กœ)

pwd (์˜ต์…˜ ์—†์ด)

โ€ข
"print working directory"์˜ ์•ฝ์ž๋กœ ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜

export (์˜ต์…˜ ์—†์ด)

โ€ข
์‚ฌ์šฉ์ž ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ค์ • (๋ณ€์ˆ˜๋ช…์— ๊ณต๋ฐฑ์ด ์žˆ์œผ๋ฉด ์•ˆ๋จ)
# ์˜ˆ์‹œ export <๋ณ€์ˆ˜๋ช…>=<๊ฐ’> : export JAVA_HOME=/user/lib/java-7-openjdk-amd64/
Shell
๋ณต์‚ฌ
# ์งœ์ฆ๋‚˜๋Š” ์˜ˆ์‹œ export a #key๊ฐ’๋งŒ ์ƒ์„ฑ export b= #value์— ์•„๋ฌด ๊ฐ’ ์—†์Œ export c=hello export c+=world #ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋’ค์— ๋ง๋ถ™์ด๊ธฐ export d="oh my god" #echo์ถœ๋ ฅ๊ณผ export์ถœ๋ ฅ ๋‹ค๋ฆ„ export e=elephant f=flower
Bash
๋ณต์‚ฌ
echo๋กœ ์ถœ๋ ฅ
(๋งค๊ฐœ๋ณ€์ˆ˜ ์—†๋Š” export) ์ถœ๋ ฅ๊ฒฐ๊ณผ

unset (์˜ต์…˜ ์—†์ด)

โ€ข
๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐ
# ์˜ˆ์‹œ [root@wiki ~] str="hello world" [root@wiki ~] echo $str hello world [root@wiki ~] unset str [root@wiki ~] echo $str [root@zetawiki ~]
Shell
๋ณต์‚ฌ

env (์˜ต์…˜๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—†์ด)

โ€ข
์ „์—ญ ๋ณ€์ˆ˜ ์„ค์ • ๋ฐ ์กฐํšŒ

exit (์˜ต์…˜ ์—†์ด)

โ€ข
shell ์ข…๋ฃŒ

', " (๋”ฐ์˜ดํ‘œ)

<, >, >> (๋ฆฌ๋””๋ ‰์…˜)

- file descriptor aggregation์„ ์ œ์™ธํ•˜๊ณ  bash์—์„œ์ฒ˜๋Ÿผ ์ž‘๋™
โ€ข
<ย : ์ž…๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
โ€ข
>ย : ์ถœ๋ ฅ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ - ์ถœ๋ ฅ๋œ ํŒŒ์ผ์€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ž๋™์ƒ์„ฑ - ๋งŒ์•ฝ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ฎ์–ด์“ฐ๊ธฐ
โ€ข
>>ย : > ์™€ ๊ฐ™์ง€๋งŒ ์ด๋ฏธ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค

<<

โ€ข
์—ฐ์‚ฐ์ž์˜ ์˜ค๋ฅธ์ชฝ์— ์ง€์ •๋œ ๊ฒƒ์ด ํ•œ ์ค„ (์˜ˆ : EOF)์—์„œ ์ถฉ์กฑ ๋  ๋•Œ๊นŒ์ง€ ์ค„ ๋ฐ”๊ฟˆ์„ ํฌํ•จํ•œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
โ€ข
EOF ๊ฐ’์„ ์ œ์™ธํ•˜๊ณ  ์ฝ์€ ๋ชจ๋“  ๊ฒƒ์„ ์™ผ์ชฝ ํ”„๋กœ๊ทธ๋žจ์˜ ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
cat << EOF > Hello > World > EOF --result-- Hello World
Shell
๋ณต์‚ฌ

| (ํŒŒ์ดํ”„)

โ€ข
command1 | command2 ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋˜๊ณ , command1์˜ ํ‘œ์ค€ ์ถœ๋ ฅ์„ command2์˜ ํ‘œ์ค€ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ. (&๋ฅผ ๋ถ™์ด๋ฉด ํ‘œ์ค€ ์—๋Ÿฌ๋„ ํ•จ๊ป˜ ์ „๋‹ฌ)

$char (๋ฉ”ํƒ€)

Ctrl + C, D, \ (์Šคํฌ๋ฆฝํŠธ ์ œ์–ด)

3. ํ‰๊ฐ€ ์ •๋ฆฌ

4. ์ฐธ๊ณ ํ• ๋งŒํ•œ ๋งํฌ

Minishell
์‰˜ ๋งŒ๋“ค๊ธฐ ์š”๊ตฌ์‚ฌํ•ญ echo cd ์ฃผ์–ด์ง„ ์ƒ๋Œ€ ๋˜๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ current working directory๋ฅผ ์ด๋™ pwd current working directory๋ฅผ ์ถœ๋ ฅ export ์˜ต์…˜ ์—†์ด : ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ชฉ๋ก ์ถœ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ฐ™์ด : ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ „์—ฐ๋ณ€์ˆ˜๋กœ ๋“ฑ๋ก export NAME=value : ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ๋ก export : ๋ชจ๋“  ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ถœ๋ ฅ unset ์˜ต์…˜์—†์ด ์ธ์ž๋งŒ : ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •ํ•œ ๊ฐ’์„ ์ง€์›Œ์ค€๋‹ค env exit ; ', " ํ† ํฐ ๊ตฌ๋ณ„์šฉ export LOGNAME=woonsik echo ""$LOGNAME"hello" -> woonsikhello echo ""$LOGNAME cc"Hi~" -> woosik ccHi~ , >> ์ž…๋ ฅ์œผ๋กœ words.text๋ฅผ ์ฃผ๊ณ  sortํ›„ words2.text๋กœ ์ถœ๋ ฅํ•œ ๋ชจ์Šต ์ž…๋ ฅ์œผ๋กœ words.text๋ฅผ ์ฃผ๊ณ  sortํ›„ ๊ธฐ์กด์˜ words2.text์— append(์ถ”๊ฐ€)ํ•œ ๋ชจ์Šต | ๋‘ ๋ช…๋ น๋ฌธ ์‚ฌ์ด์˜ ์ˆ˜์‹๋ง‰๋Œ€๋ฅผ ์ง€์นญํ•œ๋‹ค.