5์ฅ slide 11์ชฝ์ ํ5-5์ ๋์ค๋ ์์์ ๊ฐ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ
ํ์ํ error์ฒ๋ฆฌ



1) ์ฌ์ง ์ ์ฝ๋ (์ฌ์์ฑ๋ณธ)
// sysconf_demo.c
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
// Program to print system configuration values using sysconf()
int main(void)
{
long arg_max, child_max, host_name_max, login_name_max;
long clk_tck, open_max, pagesize, version;
// _SC_ARG_MAX : Maximum length of arguments for exec()
if ((arg_max = sysconf(_SC_ARG_MAX)) == -1)
perror("_SC_ARG_MAX error");
else
printf("_SC_ARG_MAX = %ld\n", arg_max);
// _SC_CHILD_MAX : Maximum number of processes per UID
if ((child_max = sysconf(_SC_CHILD_MAX)) == -1)
perror("_SC_CHILD_MAX error");
else
printf("_SC_CHILD_MAX = %ld\n", child_max);
// _SC_HOST_NAME_MAX : Maximum length of hostname
if ((host_name_max = sysconf(_SC_HOST_NAME_MAX)) == -1)
perror("_SC_HOST_NAME_MAX error");
else
printf("_SC_HOST_NAME_MAX = %ld\n", host_name_max);
// _SC_LOGIN_NAME_MAX : Maximum length of login name
if ((login_name_max = sysconf(_SC_LOGIN_NAME_MAX)) == -1)
perror("_SC_LOGIN_NAME_MAX error");
else
printf("_SC_LOGIN_NAME_MAX = %ld\n", login_name_max);
// _SC_CLK_TCK : Number of clock ticks per second
if ((clk_tck = sysconf(_SC_CLK_TCK)) == -1)
perror("_SC_CLK_TCK error");
else
printf("_SC_CLK_TCK = %ld\n", clk_tck);
// _SC_OPEN_MAX : Max number of open files per process
if ((open_max = sysconf(_SC_OPEN_MAX)) == -1)
perror("_SC_OPEN_MAX error");
else
printf("_SC_OPEN_MAX = %ld\n", open_max);
// _SC_PAGESIZE : Memory page size (bytes)
if ((pagesize = sysconf(_SC_PAGESIZE)) == -1)
perror("_SC_PAGESIZE error");
else
printf("_SC_PAGESIZE = %ld bytes\n", pagesize);
// _SC_VERSION : POSIX version supported (e.g., 200809)
if ((version = sysconf(_SC_VERSION)) == -1)
perror("_SC_VERSION error");
else
printf("_SC_VERSION = %ld\n", version);
return 0;
}
์ปดํ์ผ/์คํ:
gcc -Wall -Wextra -O2 -o sysconf_demo sysconf_demo.c
./sysconf_demo
2) ๊ฐ ํญ๋ชฉ์ด ์๋ฏธํ๋ ๊ฒ
- _SC_ARG_MAX
exec*()๋ก ์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋ค ๋ ์ ๋ฌ ๊ฐ๋ฅํ ์ธ์+ํ๊ฒฝ์ ์ด ํฌ๊ธฐ ์ํ(๋ฐ์ดํธ).
๋ฆฌ๋ ์ค์ ๊ฒฝ์ฐ ๋ณดํต ์ MB(์: 2,097,152) ์ ๋. - _SC_CHILD_MAX
ํ UID๊ฐ ๋์์ ์์ฑํ ์ ์๋ ํ๋ก์ธ์ค ์ ์ต๋๊ฐ(์ค์ ๋ก ์์ ํ๊ณ/ulimit์ ์ํฅ์ ๋ฐ์). - _SC_HOST_NAME_MAX
ํธ์คํธ๋ช ์ต๋ ๊ธธ์ด(๋ฌธ์ ์). ํํ 64. - _SC_LOGIN_NAME_MAX
๋ก๊ทธ์ธ ์ด๋ฆ ์ต๋ ๊ธธ์ด. ํํ 256. - _SC_CLK_TCK
1์ด๋น ์๊ณ ํฑ ์(์ปค๋์ ์ค์ผ์ค๋ง ๊ธฐ๋ณธ ๋จ์). ํํ 100. - _SC_OPEN_MAX
ํ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ด ์ ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ์์ ์ํ(์ํํธ ํ๊ณ).
ulimit -n์ ๊ฐ๊ณผ ์ฐ๊ฒฐ๋์ด ๋ณดํต 1024 ๋ฑ. - _SC_PAGESIZE
๋ฉ๋ชจ๋ฆฌ ํ์ด์ง ํฌ๊ธฐ(๋ฐ์ดํธ). x86/amd64 ๋ฆฌ๋ ์ค์์ ๋ณดํต 4096. - _SC_VERSION
์ง์๋๋ POSIX ํ์ค ๋ฒ์ (์: 200809 → POSIX.1-2008).
์ค์ ์ซ์๋ ๋จธ์ /์ปจํ ์ด๋/๋ฆฌ๋ฏธํธ ์ค์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ ธ์.
3) ์ sysconf()๋ฅผ ์ฐ๋?
- ํค๋์ ์์(์: ARG_MAX)๋ ์ปดํ์ผ ์์ ์ ๊ธฐ๋ณธ๊ฐ์ผ ์ ์์ด์.
- sysconf()๋ ๋ฐํ์์ ์ปค๋/๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค๊ณ ์๋ ํ์ฌ ๊ฐ์ ๋๋ ค์ค๋๋ค.
(์: ulimit๋ก ์ด ์ ์๋ ํ์ผ ์๋ฅผ ๋ฐ๊พธ๋ฉด _SC_OPEN_MAX ๊ฒฐ๊ณผ๋ ๋ฌ๋ผ์ง ์ ์์)
4) ์ฃผ์ํ ์ (์ฌํ)
- sysconf()๋ ์คํจ ์ -1์ ๋ฐํํ์ง๋ง, ์ผ๋ถ ํญ๋ชฉ์ “๋ฌด์ ํ/์ ์ ์์”์ ์๋ฏธ๋ก๋ -1์ ๋ฐํํ ์ ์์ด์.
์๋ฌ์ ๊ตฌ๋ถํ๋ ค๋ฉด ํธ์ถ ์ง์ errno = 0์ผ๋ก ์ด๊ธฐํํ๊ณ , ๋ฐํ๊ฐ์ด -1์ผ ๋ errno๊ฐ 0์ธ์ง ํ์ธํ๋ ํจํด์ด ์์ ํฉ๋๋ค. -
errno = 0;
long v = sysconf(_SC_CHILD_MAX);
if (v == -1 && errno != 0) {
perror("_SC_CHILD_MAX");
} else if (v == -1) {
printf("_SC_CHILD_MAX = unlimited/indeterminate\n");
} else {
printf("_SC_CHILD_MAX = %ld\n", v);
}
- ๊ฐ๋ค์ ๋ฆฌ์์ค ์ ํ(rlimit) ๊ณผ๋ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด _SC_OPEN_MAX๋ getrlimit(RLIMIT_NOFILE)์ ์ํํธ ํ๊ณ์ ์ํด ์ ํ๋ผ์.
- ๋น์ทํ ์น๊ตฌ๋ค:
- pathconf()/fpathconf(): “๊ฒฝ๋ก/์ด๋ ค ์๋ ํ์ผ”์ ๋ํด ํ์ผ์์คํ ์ข ์ ํ๊ณ๋ฅผ ๋ฐํ์์ ์ง์.
- getconf ๋ช ๋ น: ์์์ ๊ฐ์ ๋ด์ฉ ํ์ธ ๊ฐ๋ฅ(์: getconf ARG_MAX).
5) ์์ ์ถ๋ ฅ(๋ฆฌ๋ ์ค์ ํํ ์ — ์์คํ ์ ๋ฐ๋ผ ๋ค๋ฆ)
_SC_ARG_MAX = 2097152
_SC_CHILD_MAX = 63622
_SC_HOST_NAME_MAX = 64
_SC_LOGIN_NAME_MAX = 256
_SC_CLK_TCK = 100
_SC_OPEN_MAX = 1024
_SC_PAGESIZE = 4096 bytes
_SC_VERSION = 200809
ํ ์ค ์์ฝ
์ด ํ๋ก๊ทธ๋จ์ sysconf()๋ก ํ์ฌ ์์คํ ์ ์คํํ๊ฒฝ ํ๊ณ(์ธ์ ํฌ๊ธฐ, ์ต๋ ํ๋ก์ธ์ค ์, ํ์ด์ง ํฌ๊ธฐ, ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ๊ณ, POSIX ๋ฒ์ ๋ฑ) ๋ฅผ ๋ฐํ์์ ์กฐํํด ์ถ๋ ฅํ๋ ํ๊ฒฝ ์ ๊ฒ์ฉ ๋๊ตฌ์ ๋๋ค.
'6. CS ๊ธฐ์ด ๐ > Linux & Unix ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Linux/Unix] shํ์ผ ์คํ (0) | 2025.10.21 |
|---|---|
| [Linux/Unix][7-2] date ์ถ๋ ฅ (0) | 2025.10.21 |
| [Linux/Unix][6-3] ํฉ&ํ๊ท ์ถ๋ ฅ ํ๋ก๊ทธ๋จ (0) | 2025.10.21 |
| [Linux/Unix][6-2] $ ./2 test.txt test.bak (0) | 2025.10.21 |
| [Linux/Unix][6-1] txt write err ์ฒ๋ฆฌ (0) | 2025.10.21 |