๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
6. CS ๊ธฐ์ดˆ ๐Ÿ“š/Linux & Unix ๐Ÿง

[Linux/Unix][7-1] sysocnf(3) ํ•จ์ˆ˜ ํ™œ์šฉ

by lxvxxu 2025. 10. 21.

 

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 ๋ฒ„์ „ ๋“ฑ) ๋ฅผ ๋Ÿฐํƒ€์ž„์— ์กฐํšŒํ•ด ์ถœ๋ ฅํ•˜๋Š” ํ™˜๊ฒฝ ์ ๊ฒ€์šฉ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.