| ๐ 1 | [02] ๋ฆฌ๋ ์ค์ ๋์ค์์คํ ํ๋ก๊ทธ๋๋ฐ์์ดํด | ๋ฆฌ๋ ์ค/์ ๋์ค ์์คํ ๊ตฌ์กฐ์ ํ์ค, ์์คํ ํธ์ถ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์, man ํ์ด์ง ์ฌ์ฉ๋ฒ |
| ๐งญ 2 | [02] vi | vi ์๋ํฐ ์ฌ์ฉ๋ฒ — ๋ชจ๋, ๋ช ๋ น์ด, ํธ์ง, ์ ์ฅ ๋ฑ |
| ๐ป 3 | [03] ๋ฐฐ์ ์ ธ | Bash ์ ธ ๊ธฐ์ด, ์ ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ , ํ๊ฒฝ ๋ณ์, ์ ธ ๋ช ๋ น ํ์ฉ |
| ๐ 4 | [03] ํ์ผ ์ ๊ทผ ๊ถํ ๊ด๋ฆฌ | ํ์ผ ์์ฑ ๋ฐ ์ ๊ทผ๊ถํ(chmod, umask, ls -l) |
| โ๏ธ 5 | [03] ๋ฐฐ์ ์ ธ ํ๋ก๊ทธ๋๋ฐ | ์ ธ ์คํฌ๋ฆฝํธ ์์ฑ, ๋ณ์, ์ ์ด๋ฌธ, ํจ์, ๋๋ฒ๊น ๋ฑ |
| ๐ 6 | [04] ๋๋ ํฐ๋ฆฌ | ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ, ์์ฑ·์ญ์ ·๊ด๋ฆฌ ํจ์, inode ๊ฐ๋ |
| ๐ 7 | [05] ํ์ผ ๋ค๋ฃจ๊ธฐ | ํ์ผ ์ ๋ณด ๊ฒ์, ์ ๊ทผ ๊ถํ ์ ์ด, ๋งํฌ ํ์ผ ์์ฑ |
| ๐งพ 8 | [06] ํ์ผ ์ ์ถ๋ ฅ | ์ ์์ค·๊ณ ์์ค ํ์ผ ์ ์ถ๋ ฅ(open, read, write, fopen ๋ฑ) |
| ๐ง 9 | [07] ์์คํ ์ ๋ณด | uname, sysconf, pathconf ๋ฑ ์์คํ ์ ๋ณด ๊ฒ์ |
| โก 10 | [07] ํ๋ก์ธ์ค ์ ๋ณด | ํ๋ก์ธ์ค ๊ตฌ์กฐ, ์ํ, ps, sysinfo ํจ์ ๋ฑ |
๐งญ Part 1. ๋ฆฌ๋ ์ค/์ ๋์ค ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ์ดํด
(Understanding UNIX/Linux System Programming)
๐ฏ Contents
- ๋ฆฌ๋ ์ค/์ ๋์ค ์์คํ ๊ณผ ๊ด๋ จ๋ ํ์ค์ ์ดํดํ๋ค.
- ์์คํ ํธ์ถ(System Call) vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์(Library Function)
- C compiler, make ๋๊ตฌ ์ฌ์ฉ
๐งฉ 01. ๋ฆฌ๋ ์ค/์ ๋์ค ์์คํ ํ๋ก๊ทธ๋๋ฐ์ด๋
(What is Linux/UNIX System Programming?)
๐ฅ๏ธ ๋ฆฌ๋ ์ค์ ์ ๋์ค (Linux and UNIX)
- ๋ฆฌ๋
์ค์ ์ ๋์ค๋ ์๋ฒ์ฉ ์ด์์ฒด์ (OS) ๋ก ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
(Linux and UNIX are primarily used as server operating systems.) - ์ต๊ทผ์๋ ์ ๋์ค(UNIX) ๋ฅผ ๋์ฒดํ์ฌ ๋ฆฌ๋
์ค(Linux) ๊ฐ ์๋ฒ ์ด์์ฒด์ ์์ฅ์ ์ฃผ๋ํ๊ณ ์๋ค.
(Recently, Linux has replaced traditional UNIX systems and dominates the server OS market.) - ํนํ ๊ธ์ต๊ถ ๋ฑ์์๋ ๊ธฐ์กด์ ์ ๋์ค ์์คํ
์ ๋ฆฌ๋
์ค๋ก ์ ํํ๋ U2L(Migration: UNIX to Linux) ์ด ํ์ฐ๋๊ณ ์๋ค.
(In financial industries, UNIX to Linux migration (U2L) has been widely adopted.)
โ๏ธ ์์คํ ํธ์ถ (System Call)
์์คํ ์ด ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ฐ๊ฒฐํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค.
- ์์คํ
์ด ์ ๊ณตํ๋ ์๋น์ค๋ฅผ ํ๋ก๊ทธ๋จ์ด ์ง์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ์ธํฐํ์ด์ค.
(Provides an interface for programs to use kernel-level services directly.) - ๋ฆฌ๋ ์ค/์ ๋์ค์์ ์คํ๋๋ ํ๋ก๊ทธ๋จ ๋๋ถ๋ถ์ ์์คํ ํธ์ถ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค.
๐ ์์:
- open()์ ํ์ผ์ ์ฌ๋ ์์คํ ํธ์ถ์ด๋ค.
- ํ์ผ ์ ๊ทผ, ํ๋ก์ธ์ค ์ ์ด, ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ๋คํธ์ํฌ ํต์ ๋ฑ ๊ฑฐ์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ์์คํ ํธ์ถ์ ํตํด ์ ๊ณต๋๋ค.
๐งพ 02. ๋ฆฌ๋ ์ค/์ ๋์ค ์์คํ ํ์ค (Standards of UNIX/Linux Systems)
๐๏ธ ์ ๋์ค์ ๊ฐ๋ฐ (Development of UNIX)
- 1969๋
, ๋ฏธ๊ตญ AT&T ๋ฒจ ์ฐ๊ตฌ์(Bell Labs) ์ Ken Thompson ๊ณผ Dennis Ritchie ๊ฐ ๊ฐ๋ฐ.
(Developed in 1969 by Ken Thompson and Dennis Ritchie at AT&T Bell Labs.) - ์ด๊ธฐ์๋ ์ด์
๋ธ๋ฆฌ์ด๋ก ์์ฑ๋์์ผ๋, 1973๋
C์ธ์ด๋ก ๋ค์ ์์ฑ๋์ด
โค “๊ณ ๊ธ ์ธ์ด๋ก ์์ฑ๋ ์ต์ด์ ์ด์์ฒด์ ” ๋ก ํ๊ฐ๋ฐ๋๋ค.
(Rewritten in C language in 1973, becoming the first OS written in a high-level language.)
๐งฎ ์ ๋์ค์ ๊ธฐ๋ฅ (Features of UNIX)
- ์ด๊ธฐ์ ์์ค ์ฝ๋๊ฐ ๊ณต๊ฐ๋์ด ๋ํ๊ต, ๊ธฐ์ ๋ฑ์์ ์์ ๋กญ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ.
- ๋ค์ํ ๊ฐ๋ฐ์๋ค์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ฉด์ ์ฌ๋ฌ ํ์ ๋ฒ์ (Variants) ์ด ์๊ฒจ๋จ.
- AT&T ๊ณ์ด → System V
- ๋ฒํด๋ฆฌ ๋ํ ๊ณ์ด → BSD (Berkeley Software Distribution)
- BSD ๋ฒ์ ์์๋ TCP/IP ๊ธฐ๋ฐ ๋คํธ์ํฌ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์ด, ํ๋ ๋ฆฌ๋
์ค ๋คํธ์ํน์ ๊ธฐ๋ฐ์ด ๋จ.
(BSD added TCP/IP networking, which influenced modern Linux networking.)
๐งฑ ์ ๋์ค์ ๋ฐ์ (Evolution of UNIX)
- 1991๋
, Linus Torvalds ๊ฐ ๊ฐ์ธ ํ๋ก์ ํธ๋ก ๋ฆฌ๋
์ค(Linux)๋ฅผ ๋ฐํ.
(In 1991, Linus Torvalds released Linux as an open-source OS.) - ์คํ์์ค๋ก ๊ณต๊ฐ๋๋ฉด์ ์๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฐธ์ฌํด ๋น ๋ฅด๊ฒ ๋ฐ์ .
- ํ์ฌ๋ ํ๋์ ์ปค๋์ ๊ธฐ๋ฐ์ผ๋ก ์๋ง์ ๋ฐฐํฌํ(Distribution) ์ด ์กด์ฌํ๋ค.
์: Ubuntu, Fedora, CentOS, Debian ๋ฑ.
๐งพ 03. ์ ๋์ค์ ์ฃผ์ ํ์ค (Major UNIX Standards)
1๏ธโฃ ANSI C ํ์ค (ANSI C Standard)
- ๋ฏธ๊ตญํ์คํํ(ANSI)๊ฐ ์ ์ ํ C ์ธ์ด ํ์ค ๊ท๊ฒฉ.
- C ์ธ์ด ๋ฌธ๋ฒ, ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํค๋ ํ์ผ ๋ฑ์ ์ ์.
- ๋ฆฌ๋ ์ค/์ ๋์ค ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ๋๋ถ๋ถ ์ด ํ์ค์ ๊ธฐ๋ฐ์ผ๋ก ํจ.
2๏ธโฃ POSIX (Portable Operating System Interface)
- ์ ๋์ค ๊ธฐ๋ฐ ์์คํ ๊ฐ ์ด์์ฑ(Portability) ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์ด์์ฒด์ ์ธํฐํ์ด์ค ํ์ค.
- IEEE์์ ์ ์ํ ๊ท๊ฒฉ์ด๋ฉฐ, ์ ๋์ค ๊ณ์ด OS์ ๊ณตํต API๋ฅผ ๊ท์ ํจ.
- ์์คํ ํธ์ถ๊ณผ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๋์ ๋ฐฉ์์ด ํ์คํ๋์ด ์์.
๐ ์์: fork(), read(), write() ํจ์๋ค์ POSIX ํ์ค์ ๋ฐ๋ผ ์ ์๋จ.
3๏ธโฃ X/Open ๊ฐ์ด๋ (X/Open Guide)
- 1984๋ , ์ ๋ฝ์ ์ ๋์ค ์ ์กฐ์ ์ฒด๋ค์ด ์ค๋ฆฝํ ๋จ์ฒด X/Open ์์ ์ ์ํ ํ์ค.
- ๋ชฉํ: ์๋ก ๋ค๋ฅธ ์ ๋์ค ์์คํ ์์๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋์ผํ๊ฒ ๋์ํ๋๋ก ์ด์์ฑ ๊ฐํ.
- 1988๋ ๋ฐํ๋ XPG3 ์ POSIX ํตํฉ, 1992๋ ๋ฐํ๋ XPG4 ๊ฐ ์ต์ข ๋ฒ์ .
4๏ธโฃ ๋จ์ผ ์ ๋์ค ๋ช ์ธ (SUS, Single UNIX Specification)
- “์ ๋์ค”๋ผ๋ ์ด๋ฆ์ ๊ณต์์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ํ์ค์ ์ด์นญ.
- IEEE, ISO, The Open Group์ด ๊ณต๋์ผ๋ก ๊ฐ๋ฐ/ํ์คํํ ๊ฒฐ๊ณผ๋ฌผ.
- ์ค์คํด ๊ทธ๋ฃน์ด ๊ฐ๋ฐ ๋ฐ ์ ์ง/๊ด๋ฆฌ๋ฅผ ๋ด๋น
- 1980๋ ๋ ์ค๋ฐ๋ถํฐ ์์๋ ์ ๋์ค์ ์์คํ ์ธํฐํ์ด์ค๋ฅผ ํ์คํํ๊ธฐ ์ํ ํ๋ก์ ํธ์์ ์ถ๋ฐ
- ํ์ฌ์ POSIX ํ์ค๋ SUS์ ํฌํจ๋์ด ์๋ค.
๐ ์ฆ, POSIX ⊂ SUS (POSIX๋ SUS์ ์ผ๋ถ์)
5๏ธโฃ SVID (System V Interface Definition)
- AT&T์ System V UNIX ์ธํฐํ์ด์ค๋ฅผ ์ ์.
- ํ๋ก๊ทธ๋จ๊ณผ ์ฅ์น๊ฐ ์ฌ์ฉํ๋ ์์คํ ํธ์ถ ๋ฐ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ดํ ํ์ค ํฌํจ.
- POSIX์ X/Open์ ๊ธฐ์ด๊ฐ ๋์์.
- 1995๋ ๋ฐํ๋ SVID ๋ฒ์ 4๋ XPG4 ๋ฐ POSIX 1003.1-1990๊ณผ ํธํ๋จ.
- SVID๋ POSIX์ ๋จ์ผ ์ ๋์ค ๋ช ์ธ์ ํฌํจ๋๋ฉด์ ์ค์๋๊ฐ ๋จ์ด์ง
โ๏ธ 04. ์์คํ ํ๋ก๊ทธ๋๋ฐ (System Programming)
๐งฉ ์์คํ ํธ์ถ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์
| ๊ตฌ๋ถ | ์์คํ ํธ์ถ (System Call) | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ (Library Function) |
| ์ ์ | ์ปค๋์ ์๋น์ค๋ฅผ ์ง์ ์์ฒญํ๋ ํจ์ | ์์คํ
ํธ์ถ์ ๊ฐ์ธ๊ฑฐ๋ ์์ฉ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ํจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํฌํจ๋ ํจ์ |
| ์์น | ์ปค๋ ์์ญ(Kernel Space) | ์ฌ์ฉ์ ์์ญ(User Space) |
| ์์ | read(), write(), fork() | printf(), fopen() |
| ํธ์ถ ๋ฐฉ์ | ์ปค๋ ์ธํฐ๋ฝํธ๋ฅผ ํตํด ์ง์ ํธ์ถ | ๋ด๋ถ์ ์ผ๋ก ์์คํ ํธ์ถ์ ์ด์ฉํจ |
| ์๋ | ์๋์ ์ผ๋ก ๋๋ฆผ(์ปจํ ์คํธ ์ค์์นญ ๋ฐ์) | ๋น ๋ฆ(์ ์ ๋ ๋ฒจ ์คํ) |
| - ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ํ๋ก๊ทธ๋จ์ ์ปดํ์ผํ ๋ ๊ฐ์ด ์ ์ฌ๋์ด ์คํ ํ์ผ์ ๊ตฌ์ฑ - ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : ์คํ ํ์ผ์ ํฌํจ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ์ฌ์ฉ |
๐ก man ํ์ด์ง (Manual Page)
๋ฆฌ๋ ์ค/์ ๋์ค์ ๋ชจ๋ ๋ช ๋ น, ์์คํ ํธ์ถ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ๋ํ ๋งค๋ด์ผ ํ์ด์ง.
๋งค๋ด์ผ์ ํญ๋ชฉ์ ์ข ๋ฅ์ ๋ฐ๋ผ ์น์ ์ด ๊ตฌ๋ถ๋์ด ์์.
| ๊ตฌ๋ถ | ์น์ ๋ฒํธ | |
| 1 | ์ผ๋ฐ ๋ช ๋ น์ด (User commands) | ๋ฆฌ๋ ์ค์์ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ๋ช ๋ น์ ๋ํ ์ค๋ช |
| 2 | ์์คํ ํธ์ถ (System calls) | |
| 3 | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ (Library functions) | |
| 4 | ๋๋ฐ์ด์ค ํ์ผ (Devices) | |
| 5 | ์ค์ ํ์ผ ํ์ (File formats) | |
| 6 | ๊ฒ์ (Games) | |
| 7 | ๊ธฐํ (Miscellaneous) | |
| 8 | ๊ด๋ฆฌ์ ๋ช ๋ น์ด (Admin commands) |
- man ๋ช ๋ น์ผ๋ก ๊ฒ์ ์ ์น์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ๋ฎ์ ๊ฒ์ด ๊ธฐ๋ณธ์ผ๋ก ์ถ๋ ฅ๋จ.
- man ๋ช ๋ น์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ์์ ๋ฆฌ๋ ์ค์ ์ ๋์ค์์ ์ฐจ์ด๊ฐ ์์.
์์ ๋ช ๋ น:
man 2 open
→ ์์คํ ํธ์ถ open()์ ๋งค๋ด์ผ ํ์ธ
man 3 printfโ
→ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ printf()์ ๋งค๋ด์ผ ํ์ธ
OPEN(2) Linux Programmer's Manual
open, openat, creat — open and possibly create a file
FOPEN(3) Linux Programmer's Manual
fopen, fdopen, freopen — stream open functions
[์ถ๊ฐ๋ ๋ด์ฉ]
- man ๊ฒฐ๊ณผ๋ ๋ฆฌ๋ ์ค ๋ฐฐํฌํ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ํ์๋ ์ ์๋ค.
- ์ ๋์ค(์: Solaris)์์๋ man open ์ ๋ ฅ ์ (2)๊ฐ ๋ถ์ open(2) ์ผ๋ก ํ์๋๋ค.
- ์น์ ๋ฒํธ๋ ๋ช ๋ น, ํจ์๊ฐ ์ค๋ณต๋ ๋ ๊ตฌ๋ถ์ฉ์ผ๋ก ์ค์ํ๋ค.
๐ง ํต์ฌ ์์ฝ (Summary)
| System Call | ์ปค๋๊ณผ ์ง์ ํต์ ํ๋ ์ ์์ค ํจ์ |
| Library Function | ํธ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ณ ์์ค ํจ์ |
| POSIX | ์ ๋์ค ๊ณ์ด ์์คํ ์ ๊ณตํต ํ์ค |
| SUS | ๋จ์ผ ์ ๋์ค ๋ช ์ธ, POSIX ํฌํจ |
| SVID | System V UNIX ๊ธฐ๋ฐ ์ธํฐํ์ด์ค |
| man ๋ช ๋ น | ์์คํ ๋ช ๋ น ๋ฐ ํจ์์ ๋งค๋ด์ผ ํ์ด์ง ์กฐํ |
โจ [์ถ๊ฐ๋ ๋ด์ฉ ์์ฝ]
- [์ถ๊ฐ๋ ๋ด์ฉ]์๋ ๊ต์ฌ ์๋ฌธ์ ๋ถ์กฑํ๋ ๋ฐฐ๊ฒฝ ์ค๋ช ๊ณผ ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ์ค๋ฌด์ ๋งฅ๋ฝ์ ๋ณด์ถฉํจ.
- ํนํ POSIX์ SUS์ ๊ด๊ณ, man ํ์ด์ง ๊ตฌ์กฐ, System Call vs Library Function ์ฐจ์ด๋ฅผ ๋ช ํํ ์ ๋ฆฌ.
- ๊ต์ฌ์ฉ ๋ฌธ์๋ก ํ์ฉ ์, ๊ฐ ํ ์๋์ ์ค์ต ์์(open, printf, man)๋ฅผ ์ง์ ๋ฐ๋ผํด๋ณผ ์ ์๋๋ก ๊ตฌ์ฑ.
๐งฉ ์์ 1-1 ์์คํ ํธ์ถ์ ์ค๋ฅ ์ฒ๋ฆฌํ๊ธฐ
๐ก ๊ฐ๋ ์ ๋ฆฌ
์์คํ ํ๋ก๊ทธ๋๋ฐ์์ system call(์์คํ ํธ์ถ)์ ์ด์์ฒด์ ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค์ด๋ค.
์๋ฅผ ๋ค์ด, ํ์ผ ์กด์ฌ ํ์ธ (access()), ํ๋ก์ธ์ค ์์ฑ (fork()), ๋ฉ๋ชจ๋ฆฌ ํ ๋น (malloc()) ๋ฑ์ด ์์คํ ํธ์ถ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ค.
์์คํ
ํธ์ถ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋ฆฌํด๊ฐ์ผ๋ก –1์ ๋ฐํํ๊ณ ,
์ ์ญ ๋ณ์ errno ์ ์ค๋ฅ ๋ฒํธ๋ฅผ ์ ์ฅํ๋ค.
์ด errno ๋ ์๋ฌ์ ์์ธ์ ํ์คํ๋ ์ฝ๋๋ก ๋ํ๋ธ๋ค.
๐งพ ์์ค์ฝ๋
01 #include <stdio.h>
02 #include <unistd.h>
03 #include <errno.h>
05 extern int errno;
07 int main() {
08 if (access("test.txt", F_OK) == -1) {
09 printf("errno = %d\n", errno);
10 }
11 }
๐ ์ฝ๋ ํด์ค
| 05 | extern int errno; | ์ ์ญ ๋ณ์ errno ๋ฅผ ์ธ๋ถ์์ ์ฐธ์กฐ ํจ. ์์คํ ํธ์ถ์ด ์คํจํ ๋ ์๋ฌ ๋ฒํธ๋ฅผ ์ ์ฅ. |
| 08 | access("test.txt", F_OK) | ํ์ฌ ๋๋ ํฐ๋ฆฌ์ test.txt ํ์ผ์ด ์กด์ฌํ๋์ง ํ์ธ. ์์ผ๋ฉด –1 ๋ฆฌํด. |
| 09 | printf("errno = %d\n", errno); | ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ errno ์ ๊ฐ์ ์ถ๋ ฅ. |
๐งฉ ์คํ ๊ฒฐ๊ณผ ๋ฐ ํด์ค
- test.txt ํ์ผ์ด ์์ ๊ฒฝ์ฐ → access() ๊ฐ –1 ๋ฆฌํด
- errno ๊ฐ์ 2 (์ฆ, “๊ทธ๋ฐ ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ๊ฐ ์์ — No such file or directory”)
- ์ด ๊ฐ์ ์์คํ
ํค๋ errno.h ์ ์ ์๋์ด ์์ผ๋ฉฐ,
๊ฐ ์ซ์ ์ฝ๋๋ man errno ๋ช ๋ น์ผ๋ก ํ์ธํ ์ ์๋ค.
๐ง ์คํ ๊ฒฐ๊ณผ ์์
$ gcc -o example1 example1.c
$ ./example1
errno = 2
๐ง [์ถ๊ฐ๋ ๋ด์ฉ]
- errno ๋ ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ค๋ ๋ ๋ณ๋ก ๊ด๋ฆฌ๋๋ ๊ฒฝ์ฐ๋ ์๋ค. (POSIX ํ์ค)
- perror() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด errno ๊ฐ์ ํด๋นํ๋ ๋ฌธ์์ด ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ์ ์๋ค.์๋ฅผ ๋ค์ด errno = 2์ผ ๋ → ์ถ๋ ฅ: Error Message: No such file or directory
perror("Error Message");
- ์์คํ ํธ์ถ ์คํจ ์ ํญ์ errno ๋ฅผ ํ์ธํ๋ ๊ฒ์ด ์ข๋ค. ์ด๋ ๋๋ฒ๊น ๋ฐ ์๋ฌ ๋ก๊น ์ ๋งค์ฐ ์ค์ํ๋ค.
โ๏ธ ์ ๋ฆฌ
| ์์คํ ํธ์ถ | ์ด์์ฒด์ ๊ธฐ๋ฅ์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ๊ธฐ ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค |
| errno | ์ ์ญ ๋ณ์, ์์คํ ํธ์ถ ์คํจ ์ ์๋ฌ ๋ฒํธ๋ฅผ ์ ์ฅ |
| access() | ํ์ผ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์์คํ ํธ์ถ |
| F_OK | ํ์ผ์ด ์กด์ฌํ๋์ง ํ์ธํ๊ธฐ ์ํ ๋งคํฌ๋ก |
| perror() | errno ์ ํด๋นํ๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ์ถ๋ ฅ |
๐งฉ ์์ 1-2. ํ์ผ ์ด๊ธฐ — open()
01 #include <fcntl.h>
02 #include <unistd.h>
03 #include <stdio.h>
05 int main() {
06 int fd;
07 fd = open("sample.txt", O_RDONLY);
08 if (fd == -1) {
09 perror("open");
10 } else {
11 printf("File opened successfully!\n");
12 close(fd);
13 }
}
๐ ์ค๋ช
- open()์ ์์คํ ํธ์ถ๋ก ํ์ผ์ ์ด๊ณ ํ์ผ ๊ธฐ์ ์(fd)๋ฅผ ๋ฆฌํด.
- ์คํจ ์ –1์ ๋ฐํํ๊ณ errno ์ค์ .
- O_RDONLY, O_WRONLY, O_RDWR ๋ฑ์ ์ ๊ทผ ๋ชจ๋ ์ง์ ๊ฐ๋ฅ.
[์ถ๊ฐ๋ ๋ด์ฉ]
- ํ์ผ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ O_CREAT ํ๋๊ทธ๋ฅผ ์ฌ์ฉํด์ผ ์์ฑ ๊ฐ๋ฅ.
- perror()๋ฅผ ํตํด ๋ช ํํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด ์ข๋ค.
๐ ๋ก๊ทธ์ธ / ๋ก๊ทธ์์ ๋ช ๋ น
| login | ์์คํ ๋ก๊ทธ์ธ (๋ณดํต ์ฝ์์์ ์๋ ์ํ) | login user1 |
| logout / exit | ๋ก๊ทธ์ธ ์ธ์ ์ข ๋ฃ | logout exit |
| who / w | ํ์ฌ ๋ก๊ทธ์ธ ์ฌ์ฉ์ ํ์ธ | who, w |
| last | ์ต๊ทผ ๋ก๊ทธ์ธ ๊ธฐ๋ก ์กฐํ | last -n 5 |
๐ ํ์ผ / ๋๋ ํฐ๋ฆฌ ๋ช ๋ น
| ls | ๋๋ ํฐ๋ฆฌ ๋ชฉ๋ก ์ถ๋ ฅ | ls -l, ls -a |
| cd | ๋๋ ํฐ๋ฆฌ ์ด๋ | cd /etc, cd .. |
| pwd | ํ์ฌ ์์ ๋๋ ํฐ๋ฆฌ ํ์ | pwd |
| cp | ํ์ผ/๋๋ ํฐ๋ฆฌ ๋ณต์ฌ | cp file1 file2, cp -r dir1 dir2 |
| mv | ํ์ผ/๋๋ ํฐ๋ฆฌ ์ด๋ ๋๋ ์ด๋ฆ ๋ณ๊ฒฝ | mv a.txt b.txt |
| rm | ํ์ผ ์ญ์ (๋ณต๊ตฌ ๋ถ๊ฐ) | rm -f tmp.txt rm -r folder |
| mkdir / rmdir | ๋๋ ํฐ๋ฆฌ ์์ฑ / ์ญ์ | mkdir test, rmdir old |
| cat / more / less | ํ์ผ ๋ด์ฉ ์ถ๋ ฅ | cat file.txt less /etc/passwd |
| touch | ์ ํ์ผ ์์ฑ ๋๋ ์์ ์๊ฐ ๊ฐฑ์ | touch new.txt |
| stat / file | ํ์ผ ์์ฑ ๋ฐ ํ์ ํ์ธ | stat hello.c file a.out |
โก ํ๋ก์ธ์ค ๋ช ๋ น
| ps | ํ์ฌ ์คํ ์ค์ธ ํ๋ก์ธ์ค ๋ชฉ๋ก | ps -ef, ps aux |
| top / htop | ์ค์๊ฐ ํ๋ก์ธ์ค ๋ชจ๋ํฐ๋ง | top |
| kill / killall | ํ๋ก์ธ์ค ์ข ๋ฃ | kill -9 1234, killall vim |
| bg / fg | ๋ฐฑ๊ทธ๋ผ์ด๋ / ํฌ๊ทธ๋ผ์ด๋ ์ ํ | fg %1 |
| jobs | ํ์ฌ ์ ธ ์์ ๋ชฉ๋ก | jobs |
| nohup | ๋ก๊ทธ์์ ํ์๋ ์คํ ์ ์ง | nohup ./server & |
๐งฐ ๊ธฐํ ๋ช ๋ น
| chmod | ํ์ผ ๊ถํ ๋ณ๊ฒฝ | chmod 755 run.sh |
| chown | ํ์ผ ์์ ์ ๋ณ๊ฒฝ | chown user:group file |
| find | ํ์ผ ๊ฒ์ | find /home -name "*.c" |
| grep | ๋ฌธ์์ด ๊ฒ์ | grep "main" *.c |
| tar / zip / gzip | ์์ถ ๋ฐ ์์นด์ด๋ธ | tar -cvf backup.tar dir/ |
| df / du | ๋์คํฌ ์ฌ์ฉ๋ ํ์ธ | df -h du -sh * |
| ssh / scp | ์๊ฒฉ ์ ์ ๋ฐ ๋ณต์ฌ | ssh user@host scp file user@host:/dir |
| sudo | ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ๋ช ๋ น ์คํ | sudo apt update |
| man | ๋งค๋ด์ผ ํ์ด์ง ์กฐํ | man 2 open man 3 printf |
โ๏ธ vi ๋ด๋ถ ๋ช ๋ น
| i | ํ์ฌ ์ปค์ ์์น์์ ์ ๋ ฅ ๋ชจ๋๋ก ์ ํ |
| I | ํ์ฌ ์ค์ ๋งจ ์์์ ์ ๋ ฅ ์์ |
| a | ์ปค์ ๋ค์ ์์น์์ ์ ๋ ฅ ์์ |
| A | ํ์ฌ ์ค์ ๋์์ ์ ๋ ฅ ์์ |
| o | ํ์ฌ ์ค ์๋ ์ ์ค์ ์ด๊ณ ์ ๋ ฅ |
| O | ํ์ฌ ์ค ์์ ์ ์ค์ ์ด๊ณ ์ ๋ ฅ |
| ESC | ์ ๋ ฅ ๋ชจ๋์์ ๋ช ๋ น ๋ชจ๋๋ก ๋ณต๊ท |
| : | ๋ง์ง๋ง ์ค ๋ชจ๋๋ก ์ ํ (์ ์ฅ·์ข ๋ฃ ๋ฑ ๋ช ๋ น ์ ๋ ฅ) |
| :w | ํ์ผ ์ ์ฅ (write) |
| :q | ์ข ๋ฃ (quit), ๋ณ๊ฒฝ ์ฌํญ ์์ ๋๋ง ๊ฐ๋ฅ |
| :wq | ์ ์ฅ ํ ์ข ๋ฃ (write + quit) |
| ZZ | ์ ์ฅ ํ ์ข ๋ฃ (Shift+ZZ, ๋ช ๋ น ๋ชจ๋์์ ์คํ) |
| :q! | ์ ์ฅํ์ง ์๊ณ ๊ฐ์ ์ข ๋ฃ |
| :x | ์ ์ฅ ํ ์ข ๋ฃ (:wq์ ๋์ผ ๋์) |
| h | ์ผ์ชฝ์ผ๋ก ํ ๋ฌธ์ ์ด๋ |
| l | ์ค๋ฅธ์ชฝ์ผ๋ก ํ ๋ฌธ์ ์ด๋ |
| j | ํ ์ค ์๋๋ก ์ด๋ |
| k | ํ ์ค ์๋ก ์ด๋ |
| 0 | ํ์ฌ ์ค์ ๋งจ ์์ผ๋ก ์ด๋ |
| ^ | ํ์ฌ ์ค์ ์ฒซ ๋น๊ณต๋ฐฑ ๋ฌธ์๋ก ์ด๋ |
| $ | ํ์ฌ ์ค์ ๋งจ ๋์ผ๋ก ์ด๋ |
| G | ํ์ผ์ ๋ง์ง๋ง ์ค๋ก ์ด๋ |
| gg | ํ์ผ์ ์ฒซ ์ค๋ก ์ด๋ |
| Ctrl + f | ํ ํ๋ฉด ์๋๋ก ์คํฌ๋กค (page down) |
| Ctrl + b | ํ ํ๋ฉด ์๋ก ์คํฌ๋กค (page up) |
| x | ์ปค์ ์์น์ ๋ฌธ์ ์ญ์ |
| dd | ํ์ฌ ์ค ์ญ์ |
| 3dd | ํ์ฌ ์ค๋ถํฐ 3์ค ์ญ์ |
| dw | ์ปค์ ์์น์์ ๋จ์ด ์ญ์ |
| cw | ๋จ์ด ๋ณ๊ฒฝ (์ญ์ ํ ์ ๋ ฅ ๋ชจ๋ ์ง์ ) |
| yy | ํ์ฌ ์ค ๋ณต์ฌ (yank) |
| 3yy | ํ์ฌ ์ค๋ถํฐ 3์ค ๋ณต์ฌ |
| p | ๋ถ์ฌ๋ฃ๊ธฐ (put) |
| u | ์ต๊ทผ ๋ช ๋ น ์ทจ์ (undo) |
| U | ํ์ฌ ์ค ์ ์ฒด๋ฅผ ์ด์ ์ํ๋ก ๋ณต์ |
| Ctrl + r | ๋๋๋ฆฌ๊ธฐ ์ทจ์ (redo) |
| . | ์ง์ ๋ช ๋ น ๋ฐ๋ณต ์ํ |
| /๋ฌธ์์ด | ๋ฌธ์์ด์ ์๋ฐฉํฅ์ผ๋ก ๊ฒ์ |
| ?๋ฌธ์์ด | ๋ฌธ์์ด์ ๋ค๋ฐฉํฅ์ผ๋ก ๊ฒ์ |
| n | ๋ค์ ๊ฒ์ ๊ฒฐ๊ณผ๋ก ์ด๋ |
| N | ์ด์ ๊ฒ์ ๊ฒฐ๊ณผ๋ก ์ด๋ |
| :s/old/new/ | ํ์ฌ ์ค์์ ์ฒซ ๋ฒ์งธ old๋ฅผ new๋ก ์นํ |
| :s/old/new/g | ํ์ฌ ์ค์ ๋ชจ๋ old๋ฅผ new๋ก ์นํ |
| :1,$s/old/new/g | ํ์ผ ์ ์ฒด์์ old๋ฅผ new๋ก ์นํ |
| :%s/old/new/gc | ํ์ผ ์ ์ฒด ์นํ (ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ณ๊ฒฝ) |
| Ctrl + g | ํ์ฌ ํ์ผ๋ช , ์ค ๋ฒํธ, ์์น ์ ๋ณด ํ์ |
| Ctrl + d | ๋ฐ ํ์ด์ง ์๋๋ก ์คํฌ๋กค |
| Ctrl + u | ๋ฐ ํ์ด์ง ์๋ก ์คํฌ๋กค |
| :set nu | ์ค ๋ฒํธ ํ์ (number on) |
| :set nonu | ์ค ๋ฒํธ ์จ๊น (number off) |
| :!command | vi ๋ด๋ถ์์ ์ธ๋ถ ๋ช ๋ น ์คํ (:!ls, :!gcc) |
| :r file | ์ธ๋ถ ํ์ผ ๋ด์ฉ์ ํ์ฌ ํธ์ง ์ค์ธ ํ์ผ์ ๋ถ๋ฌ์ค๊ธฐ |
๐ง ์ปดํ์ผ ํ๊ฒฝ ์์ฝ
| โ ์ ์ฒ๋ฆฌ | #include, #define ์ฒ๋ฆฌ | .i | gcc -E main.c -o main.i |
| โก ์ปดํ์ผ | C ์ฝ๋ → ์ด์ ๋ธ๋ฆฌ์ด | .s | gcc -S main.c -o main.s |
| โข ์ด์ ๋ธ | ์ด์ ๋ธ๋ฆฌ์ด → ์ค๋ธ์ ํธ | .o | gcc -c main.c -o main.o |
| โฃ ๋งํฌ | ์ค๋ธ์ ํธ + ๋ผ์ด๋ธ๋ฌ๋ฆฌ → ์คํํ์ผ | a.out ๋๋ ์ง์ ๋ช | gcc main.o -o main |
๐งฐ gcc ์ฃผ์ ์ต์
| -o | ์คํํ์ผ ์ด๋ฆ ์ง์ | gcc main.c -o app |
| -c | ์ปดํ์ผ๋ง ์ํ (๋งํฌ X) | gcc -c util.c |
| -Wall | ๋ชจ๋ ๊ฒฝ๊ณ ํ์ | gcc -Wall main.c |
| -g | ๋๋ฒ๊น ์ฌ๋ณผ ํฌํจ | gcc -g test.c |
| -O, -O2, -O3 | ์ต์ ํ ๋ ๋ฒจ ์ค์ | gcc -O2 main.c |
| -I<dir> | ํค๋ ํ์ผ ๊ฒฝ๋ก ์ถ๊ฐ | gcc -Iinclude main.c |
| -L<dir> -l<name> | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋งํฌ | gcc -Llib -lmylib main.c |
๐๏ธ Makefile ๊ธฐ๋ณธ ๊ตฌ์กฐ
| TARGET | ์ต์ข ์คํํ์ผ ์ด๋ฆ | TARGET = myapp |
| OBJS | ํ์ํ ์ค๋ธ์ ํธ ๋ชฉ๋ก | OBJS = main.o util.o |
| CC | ์ฌ์ฉํ ์ปดํ์ผ๋ฌ | CC = gcc |
| CFLAGS | ์ปดํ์ผ ์ต์ | CFLAGS = -Wall -g |
| ๊ท์น (Rule) | ๋น๋ ๋ฐฉ๋ฒ ์ ์ | $(TARGET): $(OBJS) |
| ๋ช ๋ น (Command) | ์คํํ gcc ๋ช ๋ น | $(CC) $(CFLAGS) -o $(TARGET) $(OBJS) |
| clean | ์ ๋ฆฌ์ฉ ๋ช ๋ น | rm -f $(TARGET) $(OBJS) |
๐ gcc vs make ๋น๊ต
| ์ญํ | ์ปดํ์ผ๋ฌ | ๋น๋ ์๋ํ ๋๊ตฌ |
| ์ ๋ ฅ | .c, .cpp ํ์ผ | Makefile |
| ์ถ๋ ฅ | ์คํํ์ผ (a.out, ์ง์ ๋ช ) | ์คํํ์ผ (๋ด๋ถ์ ์ผ๋ก gcc ํธ์ถ) |
| ์ฌ์ฉ ๋์ | ์๊ท๋ชจ / ๋จ์ผ ํ์ผ | ๋๊ท๋ชจ / ๋ค์ค ํ์ผ ํ๋ก์ ํธ |
| ๋น๋ ๋ฐฉ์ | ๋งค๋ฒ ์ ์ฒด ์ฌ์ปดํ์ผ | ์์ ๋ ํ์ผ๋ง ์ฌ์ปดํ์ผ |
| ์์ | gcc main.c -o main | make (Makefile ํ์) |
โ๏ธ gcc vs make ์ฐจ์ด์
(Difference Between gcc and make)
๐งฑ 1๏ธโฃ ํ ์ค ์์ฝ
| ๐งฐ gcc | “์ปดํ์ผ๋ฌ” — C/C++ ํ์ผ์ ์ง์ ์ปดํ์ผํ๊ณ ๋งํฌํจ |
| ๐งฎ make | “๋น๋ ์๋ํ ๋๊ตฌ” — ์ฌ๋ฌ ์์ค ํ์ผ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ณ gcc ๋ช ๋ น์ ๋์ ์คํํจ |
๐ก 2๏ธโฃ ๊ฐ๋ ๋น๊ต
| ์ ์ | GNU Compiler Collection — C, C++, etc.๋ฅผ ์ปดํ์ผํ๋ ๋๊ตฌ | Build Automation Tool — ์ปดํ์ผ ๊ณผ์ ์ ์๋ํํ๋ ๋๊ตฌ |
| ํ๋ ์ผ | ์์ค์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ (์ปดํ์ผ ๋ฐ ๋งํฌ ์ํ) | gcc ๋ช ๋ น์ ์ฌ๋ฌ ๋ฒ, ์๋์ผ๋ก ์คํ |
| ์ ๋ ฅ ๋์ | .c, .cpp ํ์ผ | Makefile (๊ท์น์ด ์ ํ ์ค์ ํ์ผ) |
| ์ถ๋ ฅ ๊ฒฐ๊ณผ | ์คํํ์ผ (.out, .exe) | ์ต์ข ์คํํ์ผ (๋ด๋ถ์ ์ผ๋ก gcc ์ฌ์ฉ) |
| ์ธ์ ์ฌ์ฉ | ํ์ผ 1~2๊ฐ๋ฅผ ์๋์ผ๋ก ์ปดํ์ผํ ๋ | ํ๋ก์ ํธ ๋จ์(ํ์ผ ์์ญ~์๋ฐฑ ๊ฐ) ๋น๋ํ ๋ |
| ์์ ๋ช ๋ น | gcc main.c -o main | make (→ ๋ด๋ถ์ ์ผ๋ก gcc ํธ์ถ) |
๐งฉ 3๏ธโฃ ์์๋ก ๋น๊ตํ๊ธฐ
โ (1) gcc๋ก ์ง์ ๋น๋
โก๏ธ ์ง์ gcc๋ก ๋ชจ๋ ์์คํ์ผ์ ํ ๋ฒ์ ๋ช
์ํด์ผ ํจ.
โก๏ธ ํ์ผ์ด ์์ ๋ ๋๋ง๋ค ๋ค์ ์ ์ฒด๋ฅผ ์ปดํ์ผํด์ผ ํจ.
โ (2) make๋ฅผ ์ด์ฉํ ์๋ ๋น๋
๐งพ Makefile ์์
์ดํ ๋จ์ํ:
โก๏ธ make๋ ํ์ผ์ ์์ ์๊ฐ(time stamp) ์ ๋น๊ตํด์
์์ ๋ .c ํ์ผ๋ง ๋ค์ gcc๋ก ์ปดํ์ผํจ.
๐ 4๏ธโฃ ๋น์ ๋ก ์ดํดํ๊ธฐ
| ๐ง gcc | “๋ง์น” — ์ง์ ์ฝ๋ ํ๋ํ๋ ์ปดํ์ผํ๋ ๋๊ตฌ |
| ๐๏ธ make | “ํ์ฅ ๊ฐ๋ ” — ์ด๋ค ํ์ผ์ ๋จผ์ , ์ด๋ค ์์๋ก, ์ด๋ค ์ต์ ์ผ๋ก ์ปดํ์ผํ ์ง ๊ด๋ฆฌํ๊ณ ์๋์ผ๋ก gcc ํธ์ถ |
๐ง 5๏ธโฃ make์ ๋ด๋ถ ๋์
1๏ธโฃ Makefile์ ์ฝ๋๋ค.
2๏ธโฃ ํ๊ฒ(target) ํ์ผ๊ณผ ๊ทธ์ ํ์ํ ์์คํ์ผ์ ์์กด ๊ด๊ณ(dependency) ๋ฅผ ํ์ธํ๋ค.
3๏ธโฃ ๋ณ๊ฒฝ๋ ํ์ผ์ด ์์ผ๋ฉด ํด๋น ํ์ผ๋ง gcc๋ก ์ฌ์ปดํ์ผํ๋ค.
4๏ธโฃ ๋งํฌ ํ ์คํํ์ผ(a.out, app, ๋ฑ)์ ์์ฑํ๋ค.
๐ 6๏ธโฃ ์ ๋ฆฌ ์์ฝ
| ๋ชฉ์ | C/C++ ์ฝ๋๋ฅผ ์ง์ ์ปดํ์ผ | ์ปดํ์ผ ์๋ํ ๋ฐ ๊ด๋ฆฌ |
| ์ ๋ ฅ | .c, .cpp ํ์ผ | Makefile |
| ์ฃผ ์ฌ์ฉ ๋์ | ์๊ท๋ชจ ํ๋ก์ ํธ | ๋๊ท๋ชจ ํ๋ก์ ํธ |
| ์ฌ์ปดํ์ผ | ๋งค๋ฒ ์ ์ฒด ์ฌ์ปดํ์ผ | ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์๋ ์ฌ์ปดํ์ผ |
| ์์ | gcc main.c -o main | make (Makefile ์ด์ฉ) |
๐ฌ [์ถ๊ฐ๋ ๋ด์ฉ]
- make๋ ๋ด๋ถ์ ์ผ๋ก gcc ์ธ์๋ clang, g++ ๋ฑ ๋ค๋ฅธ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ๋ํ ํ๋ก์ ํธ์์๋ CMake, Autotools, Meson, Ninja ๋ฑ
๋ ๋ฐ์ ๋ ๋น๋ ์์คํ ์ด make์ ์๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๋ค.
โ ์ ๋ฆฌ ๋ฌธ์ฅ
๐น gcc๋ “์ปดํ์ผ๋ฌ”์ด๊ณ ,
๐น make๋ “์ปดํ์ผ๋ฌ๋ฅผ ๊ด๋ฆฌํ๋ ์๋ํ ์์คํ ”์ด๋ค.gcc๋ ์ง์ ์คํํ๋ ๋๊ตฌ,
make๋ “๋๊ฐ, ์ธ์ , ์ด๋ค ํ์ผ์, ์ด๋ค ์ต์ ์ผ๋ก” ๋น๋ํ ์ง๋ฅผ ๋์ ๊ฒฐ์ ํด์ค๋ค.
๐งฉ ์์ 1-3. ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ — perror()
01 #include <stdio.h>
02 #include <unistd.h>
03 #include <fcntl.h>
05 int main() {
06 int fd;
07 fd = open("none.txt", O_RDONLY);
08 if (fd == -1) {
09 perror("Error");
10 }
}
๐ง ์คํ ๊ฒฐ๊ณผ
Error: No such file or directory
[์ถ๊ฐ๋ ๋ด์ฉ]
- perror()๋ errno ๊ฐ์ ์๋์ผ๋ก ํด์ํด ์ถ๋ ฅํ๋ค.
- strerror(errno) ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋ฌธ์์ด ํํ๋ก ์ง์ ๋ฐํ๋ฐ์ ์๋ ์๋ค.
๐พ ์์ 1-4. ๋ฉ๋ชจ๋ฆฌ ๋์ ํ ๋น — malloc()
01 #include <stdio.h>
02 #include <stdlib.h>
04 int main() {
05 int *p;
06 p = (int *)malloc(sizeof(int) * 3);
07 if (p == NULL) {
08 perror("malloc");
09 exit(1);
10 }
11 printf("Memory allocated successfully.\n");
12 free(p);
}
๐ ์ค๋ช
- malloc()์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋นํ๊ณ ํฌ์ธํฐ๋ฅผ ๋ฐํ.
- ์คํจ ์ NULL ๋ฐํ ๋ฐ errno ์ค์ .
- ๋ฐ๋์ free()๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ผ ํจ.
โ๏ธ ์์ 1-5. make ๋๊ตฌ ์ฌ์ฉ
๋ฆฌ๋ ์ค์์ make๋ ๋ค์์ C ์์ค์ฝ๋ ์ปดํ์ผ์ ์๋ํํ๋ค.
๐งฉ Makefile ์์
TARGET = main
OBJS = main.o util.o
CC = gcc
CFLAGS = -Wall
$(TARGET) : $(OBJS)
$(CC) -o $(TARGET) $(OBJS)
clean :
rm -f $(TARGET) $(OBJS)
๐ง ์คํ ์์
1๏ธโฃ make → ์๋์ผ๋ก ํ์ํ ํ์ผ๋ง ์ปดํ์ผ
2๏ธโฃ make clean → ์์ฑ๋ ํ์ผ ์ญ์
[์ถ๊ฐ๋ ๋ด์ฉ]
- make๋ ํ์ผ ์์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ฌ์ปดํ์ผ ํ๋ฏ๋ก ํจ์จ์ ์ด๋ค.
๐งฉ ์์ 1-6. ๋ช ๋ นํ ์ธ์ — argc, argv[]
01 #include <stdio.h>
03 int main(int argc, char *argv[]) {
04 int i;
05 for (i = 0; i < argc; i++)
06 printf("argv[%d] = %s\n", i, argv[i]);
}
๐ง ์คํ ๊ฒฐ๊ณผ
$ ./a.out test 123
argv[0] = ./a.out
argv[1] = test
argv[2] = 123
[์ถ๊ฐ๋ ๋ด์ฉ]
- argc ๋ ์ธ์ ๊ฐ์, argv[] ๋ ์ธ์ ๋ฌธ์์ด ๋ฐฐ์ด.
- ํ๋ก๊ทธ๋จ ๋์์ ๋์ ์ผ๋ก ์ ์ดํ ๋ ํ์.
๐งฉ ์์ 1-7. ์ต์ ์ฒ๋ฆฌ — getopt()
01 #include <stdio.h>
02 #include <unistd.h>
04 int main(int argc, char *argv[]) {
05 int n;
06 extern char *optarg;
07 extern int optind;
09 printf("Current Optind : %d\n", optind);
10 while ((n = getopt(argc, argv, "abc:")) != -1) {
11 switch (n) {
12 case 'a':
13 printf("Option : a\n");
14 break;
15 case 'b':
16 printf("Option : b\n");
17 break;
18 case 'c':
19 printf("Option : c, Argument=%s\n", optarg);
20 break;
21 }
22 printf("Next Optind : %d\n", optind);
23 }
}
๐ ์ค๋ช
- getopt() ํจ์๋ ์ต์ (-a, -b, -c)์ ์์๋๋ก ํ์ฑํ๋ค.
- optarg ๋ ์ต์ ์ ๋ถ์๋ ์ธ์(-c argument)๋ฅผ ์ ์ฅํ๋ค.
- optind ๋ ๋ค์ ์ธ์์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๐ง ์คํ ์์
$ ./a.out -a -c hello
Option : a
Option : c, Argument=hello
[์ถ๊ฐ๋ ๋ด์ฉ]
- ์๋ชป๋ ์ต์ ์ ๋ ฅ ์ “invalid option” ๋ฉ์์ง๋ฅผ ์ถ๋ ฅ.
- ์ค๋ฌด์์ ์ปค๋งจ๋๋ผ์ธ ํ๋ก๊ทธ๋จ ์์ฑ ์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋จ.
๐งพ ์ ๋ฆฌ
| ์์คํ ํธ์ถ | ์ด์์ฒด์ ์๋น์ค ์ ๊ทผ (์ปค๋) |
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์ | ์์คํ ํธ์ถ์ ๊ฐ์ผ ์ธํฐํ์ด์ค |
| ์๋ฌ ์ฒ๋ฆฌ | errno, perror(), strerror() |
| ๋ฉ๋ชจ๋ฆฌ ํ ๋น | malloc(), free() |
| ์ต์ ์ฒ๋ฆฌ | getopt() |
| ๋น๋ ๋๊ตฌ | make, gcc |
| ํ์ค ๋ฌธ์ | POSIX, ANSI C, SVID, SUS |
๐ [์ถ๊ฐ ์์ฝ]
- ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ์ปค๋๊ณผ ์์ฉํ๋ก๊ทธ๋จ์ ๊ฒฝ๊ณ์์ ๋์ํ๋ค.
- POSIX ํธํ์ฑ ํ๋ณด๋ ์ด์์ฑ์ ํต์ฌ์ด๋ค.
- man ๋ช ๋ น, errno, perror, getopt๋ ๋ชจ๋ ๋ฆฌ๋ ์ค ํ๋ก๊ทธ๋๋จธ์ ๊ธฐ๋ณธ๊ธฐ๋ค.
'6. CS ๊ธฐ์ด ๐ > Linux & Unix ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Linux/Unix][1] ํ์จ(Fahrenheit) -> ์ญ์จ(Celsius)๋ก ๋ณํํ๋ ํ๋ฅผ ์ถ๋ ฅํ๋ C ํ๋ก๊ทธ๋จ (0) | 2025.10.20 |
|---|---|
| [Linux/Unix] vi Editor (0) | 2025.10.20 |
| [Linux/Ubuntu] vi ํธ์ง๊ธฐ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ: ๋ชจ๋, ์ ์ฅ, ๊ธฐ๋ณธ ๋ช ๋ น์ด, ํ๋ฆ (0) | 2025.10.17 |
| [Linux/Unix] vi ํธ์ง๊ธฐ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ (0) | 2025.10.17 |
| [Linux/Unix] Ubuntu ํ๊ธ ์ ๋ ฅ ์ค์ (0) | 2025.10.17 |