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

[Linux/Unix][2-3] ์ž…๋ ฅ ์ˆซ์ž์˜ ํ•ฉ ์ถœ๋ ฅ

by lxvxxu 2025. 10. 21.

๋ญํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ธ๊ฐ€์š”?

  • ๋ชฉ์ : ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ „๋‹ฌ๋œ ๋ช…๋ นํ–‰ ์ธ์ž๋“ค(๋ฌธ์ž์—ด ์ˆซ์ž๋“ค)์„ ๋ชจ๋‘ ์ •์ˆ˜๋กœ ๋ฐ”๊ฟ” ํ•ฉ๊ณ„๋ฅผ ๊ตฌํ•ด ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ: argv[1], argv[2], …, argv[argc-1] (๊ฐ๊ฐ ์ˆซ์ž ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ๊ฐ€์ •)
  • ์ถœ๋ ฅ: ๋ชจ๋“  ์ธ์ž์˜ ํ•ฉ(longํ˜•) ํ•œ ์ค„

๋™์ž‘ ํ๋ฆ„

  1. long s = 0; — ํ•ฉ๊ณ„๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜ s๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”.
  2. for (int i = 1; i < argc; ++i) — ์ฒซ ๋ฒˆ์งธ ์ธ์ž(argv[1])๋ถ€ํ„ฐ ๋งˆ์ง€๋ง‰ ์ธ์ž๊นŒ์ง€ ์ˆœํšŒ
    (์ฃผ์˜: argv[0]์€ ์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ์ด๋ฏ€๋กœ ์ œ์™ธ)
  3. atoi(argv[i]) — ๊ฐ ์ธ์ž๋ฅผ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ํ•ด ๋ฐ˜ํ™˜.
    ๋ฐ˜ํ™˜๊ฐ’์„ long์œผ๋กœ ์บ์ŠคํŒ…ํ•ด s์— ๋ˆ„์ .
  4. printf("%ld\n", s); — ์ตœ์ข… ํ•ฉ์„ ์ถœ๋ ฅ.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    long s = 0;
    for (int i = 1; i < argc; ++i)
        s += (long)atoi(argv[i]);
    printf("%ld\n", s);

    return 0;
}

 

 

 

์œ„ ํ”„๋กœ๊ทธ๋žจ์€ ๋ช…๋ นํ–‰์œผ๋กœ ์ „๋‹ฌ๋œ ์ˆซ์ž ์ธ์ž๋“ค์„ ๋ชจ๋‘ ๋”ํ•œ ๋’ค, ๊ทธ ํ•ฉ์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค.

์‹คํ–‰ ์‹œ argv[1]๋ถ€ํ„ฐ argv[argc-1]๊นŒ์ง€์˜ ๋ฌธ์ž์—ด์„ atoi() ํ•จ์ˆ˜๋กœ ์ •์ˆ˜ํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ

long ํ˜• ๋ณ€์ˆ˜ s์— ๋ˆ„์ ํ•˜๊ณ , ๋งˆ์ง€๋ง‰์— printf("%ld\n", s)๋กœ ํ•ฉ๊ณ„๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

argv[0]์€ ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„์ด๋ฏ€๋กœ ์ œ์™ธํ•˜๊ณ  1๋ถ€ํ„ฐ ๋ฐ˜๋ณตํ•œ๋‹ค.

๋ณ€ํ™˜์—๋Š” atoi๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž์—ด์€ 0์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค(์ž…๋ ฅ ์˜ค๋ฅ˜์™€ ์‹ค์ œ 0์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•œ๋‹ค).

 

 

 

์‚ฌ์šฉ ์˜ˆ์‹œ

$ ./sum 10 20 30
60
$ ./sum -5 8 100
103
$ ./sum 3 foo 4
7            # "foo"๋Š” atoi๊ฐ€ 0์œผ๋กœ ํ•ด์„

 

๊ฐ„/๊ณต๊ฐ„ ๋ณต์žก๋„

  • ์‹œ๊ฐ„: O(n) — ์ธ์ž ์ˆ˜ n๋งŒํผ ํ•œ ๋ฒˆ์”ฉ ๋ณ€ํ™˜/๋ง์…ˆ
  • ๊ณต๊ฐ„: O(1) — ๋ˆ„์ ํ•ฉ ๋ณ€์ˆ˜๋งŒ ์‚ฌ์šฉ

์ฃผ์˜์‚ฌํ•ญ (ํ•œ๊ณ„์ )

  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์—†์Œ: atoi๋Š” ๋ณ€ํ™˜ ์‹คํŒจ ์‹œ 0์„ ๋Œ๋ ค์ค๋‹ˆ๋‹ค.
    ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ์ธ์ž("foo" ๋“ฑ)๋ฅผ ๋„ฃ์–ด๋„ ์—๋Ÿฌ๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ณ  0์œผ๋กœ ๋”ํ•จ.
  • ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ์œ„ํ—˜: ํฐ ์ˆ˜(์˜ˆ: 64๋น„ํŠธ ๋ฒ”์œ„๋ฅผ ๋„˜๋Š” ๋ฌธ์ž์—ด)๋ฅผ atoi๋กœ ์ฝ์œผ๋ฉด ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์ด ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ถ€ํ˜ธ/๊ณต๋ฐฑ ์ฒ˜๋ฆฌ: atoi๋Š” ์„ ํ–‰ ๊ณต๋ฐฑ์„ ๋ฌด์‹œํ•˜๊ณ  ๋ถ€ํ˜ธ(+/-)๋Š” ์ธ์‹ํ•˜์ง€๋งŒ, ์ง„๋‹จ ๋ฉ”์‹œ์ง€๋Š” ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ถŒ์žฅ ๊ฐœ์„ ์•ˆ : strtol ์‚ฌ์šฉ (์—๋Ÿฌ ๊ฒ€์ถœ)

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    long s = 0;
    for (int i = 1; i < argc; ++i) {
        char *end = NULL;
        errno = 0;
        long v = strtol(argv[i], &end, 10);  // 10์ง„์ˆ˜
        if (errno == ERANGE) {
            fprintf(stderr, "overflow: %s\n", argv[i]);
            return 1;
        }
        if (end == argv[i] || *end != '\0') {
            fprintf(stderr, "not a valid integer: %s\n", argv[i]);
            return 1;
        }
        if ((v > 0 && s > LONG_MAX - v) || (v < 0 && s < LONG_MIN - v)) {
            fprintf(stderr, "sum overflow\n");
            return 1;
        }
        s += v;
    }
    printf("%ld\n", s);
    return 0;
}

 

  • ์žฅ์ : ๋ณ€ํ™˜ ์‹คํŒจ(์ˆซ์ž ์•„๋‹˜), ๋ฒ”์œ„ ์ดˆ๊ณผ(์˜ค๋ฒ„ํ”Œ๋กœ์šฐ)๋ฅผ ๋ช…ํ™•ํžˆ ๊ฐ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ.
  • ์‹ค๋ฌด/๊ณผ์ œ์—์„œ ์ ์ˆ˜ ๊นŽ์ด์ง€ ์•Š์œผ๋ ค๋ฉด strtol ๊ฐ™์€ ์•ˆ์ „ํ•œ ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

 

๐Ÿงฉ 1๏ธโƒฃ argc์™€ argv์˜ ๊ธฐ๋ณธ ๊ฐœ๋…


argc argument count → ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ธ์ž์˜ ๊ฐœ์ˆ˜
argv argument vector → ๊ฐ ์ธ์ž์˜ ๋ฌธ์ž์—ด ํฌ์ธํ„ฐ ๋ฐฐ์—ด

์ฆ‰,
ํ”„๋กœ๊ทธ๋žจ์ด ์ด๋ ‡๊ฒŒ ์‹คํ–‰๋œ๋‹ค๋ฉด:

$ ./sum 10 20 30
 

๊ฐ ๊ฐ’์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

์ธ๋ฑ์Šค ๋‚ด์šฉ
argv[0] "./sum" (์‹คํ–‰ ํŒŒ์ผ ์ด๋ฆ„)
argv[1] "10"
argv[2] "20"
argv[3] "30"
argv[4] NULL (๋ฐฐ์—ด ๋ ํ‘œ์‹œ)

๊ทธ๋ฆฌ๊ณ 

 

โš™๏ธ 2๏ธโƒฃ ๋ฐ˜๋ณต๋ฌธ์˜ ์กฐ๊ฑด: i < argc์ธ ์ด์œ 

C ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ฃ .
๋”ฐ๋ผ์„œ argv์˜ **๋งˆ์ง€๋ง‰ ์‹ค์ œ ์ธ์ž ์ธ๋ฑ์Šค๋Š” argc - 1**์ž…๋‹ˆ๋‹ค.

i < argc ๋ผ๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:

i๊ฐ€ argc๋ณด๋‹ค ์ž‘์€ ๋™์•ˆ ๋ฐ˜๋ณต → ์ฆ‰, 1๋ถ€ํ„ฐ (argc - 1)๊นŒ์ง€ ์‹คํ–‰

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ ์˜ˆ์‹œ์—์„œ:

  • argc = 4
  • argv[1], argv[2], argv[3] → ์‹ค์ œ ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ธ์ž

 

i argv[i] ๊ฐ’ ๋ฐ˜๋ณต ์—ฌ๋ถ€
1 "10" 10 โœ… ์‹คํ–‰
2 "20" 20 โœ… ์‹คํ–‰
3 "30" 30 โœ… ์‹คํ–‰
4 NULL โŒ ์‹คํ–‰ ์•ˆ ํ•จ (i < argc ์กฐ๊ฑด ๋•Œ๋ฌธ์— ์ข…๋ฃŒ)  

โŒ 3๏ธโƒฃ ๋งŒ์•ฝ i <= argc์˜€๋‹ค๋ฉด?

๊ทธ๋Ÿผ ๋งˆ์ง€๋ง‰ ๋ฐ˜๋ณต์—์„œ i == argc์ผ ๋•Œ
argv[i] == argv[argc] == NULL ์ด ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์ˆ˜ํ–‰๋ผ์š”:

atoi(NULL);  // ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘(ํ”„๋กœ๊ทธ๋žจ ํฌ๋ž˜์‹œ ๊ฐ€๋Šฅ)
 

๐Ÿ‘‰ ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ์˜ค๋ฅ˜(Segmentation Fault) ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ **ํ•ญ์ƒ i < argc**๋กœ ํ•ด์•ผ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.


โœ… 4๏ธโƒฃ ์ •๋ฆฌ

์กฐ๊ฑด์˜๋ฏธ๊ฒฐ๊ณผ
i < argc ์œ ํšจํ•œ ์ธ์ž(argv[1] ~ argv[argc-1])๊นŒ์ง€๋งŒ ์ ‘๊ทผ ์ •์ƒ ๋™์ž‘
i <= argc ๋งˆ์ง€๋ง‰์— argv[argc] = NULL ์ ‘๊ทผ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ

๐Ÿง  ์ถ”๊ฐ€ ํŒ

  • argv[argc]๋Š” ํ•ญ์ƒ NULL๋กœ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.
    ์ด๊ฑด ๋ฐ˜๋ณต๋ฌธ์„ ๋ฉˆ์ถ”๋Š” “์ข…๋ฃŒ ํ‘œ์‹œ(sentinel)” ์—ญํ• ์ด์—์š”.
    ์ฆ‰, while(argv[i] != NULL) ๋กœ๋„ ์ˆœํšŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ˆ:
for (int i = 1; argv[i] != NULL; i++)
    printf("%s\n", argv[i]);

โœ… ๊ฒฐ๋ก 

i < argc๋Š” argv์˜ ์œ ํšจํ•œ ์ธ๋ฑ์Šค ๋ฒ”์œ„(0 ~ argc-1)๋งŒ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ์ „ํ•œ ์กฐ๊ฑด์ด์—์š”.
๋งŒ์•ฝ i <= argc๋กœ ํ•˜๋ฉด ๋งˆ์ง€๋ง‰์— argv[argc] == NULL์„ ์ž˜๋ชป ์ฐธ์กฐํ•ด์„œ ์˜ค๋ฅ˜(์„ธ๊ทธํดํŠธ) ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


 

argc์™€ argv

๋Š” ์‚ฌ์‹ค ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ "์ œ๊ณต"ํ•˜๋Š” ๋ณ€์ˆ˜๋“ค์ด ์•„๋‹™๋‹ˆ๋‹ค.
์กฐ๊ธˆ ๋” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, ์ด ๋‘˜์€ C ํ‘œ์ค€ ์–ธ์–ด์˜ ๋ฌธ๋ฒ•์ ์ธ ์•ฝ์†(๊ทœ์•ฝ, convention) ์œผ๋กœ์„œ
C ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ์šด์˜์ฒด์ œ(OS) ๊ฐ€ ์ž๋™์œผ๋กœ main ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋Š” ์ธ์ž๋“ค์ด์—์š”.


๐Ÿงฉ 1๏ธโƒฃ ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด

argc์™€ argv๋Š” ํ‘œ์ค€ C์˜ main ํ•จ์ˆ˜ ์ธ์ž๋กœ,
์–ด๋–ค ํ—ค๋” ํŒŒ์ผ์—๋„ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์•„์š”.
์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ main() ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.


โš™๏ธ 2๏ธโƒฃ ํ‘œ์ค€ ๋ฌธ๋ฒ• (C ํ‘œ์ค€์—์„œ์˜ ์ •์˜)

C ํ‘œ์ค€์—์„œ main ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋Š” ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค๐Ÿ‘‡

 
int main(void)              // ์ธ์ž ์—†๋Š” ํ˜•ํƒœ
int main(int argc, char *argv[])   // ์ธ์ž ์žˆ๋Š” ํ˜•ํƒœ

 

๋˜๋Š” ๋™์ผํ•˜๊ฒŒ ์•„๋ž˜์ฒ˜๋Ÿผ ์จ๋„ ๋ฉ๋‹ˆ๋‹ค:

int main(int argc, char **argv)
 

๐Ÿ“˜ ์—ฌ๊ธฐ์„œ:

  • argc → argument count (์ธ์ž ๊ฐœ์ˆ˜)
  • argv → argument vector (์ธ์ž๋“ค์˜ ๋ฌธ์ž์—ด ๋ฐฐ์—ด)

์ด๊ฑด #include๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,
C ์‹คํ–‰ ํ™˜๊ฒฝ(Runtime system)์ด main์„ ํ˜ธ์ถœํ•  ๋•Œ ์ž๋™์œผ๋กœ ๊ฐ’์„ ์ฑ„์›Œ ๋„ฃ์Šต๋‹ˆ๋‹ค.


๐Ÿง  3๏ธโƒฃ ๋‚ด๋ถ€ ๋™์ž‘ ๊ตฌ์กฐ

์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ,
์ปค๋งจ๋“œ๋ผ์ธ์—์„œ ์ž…๋ ฅํ•œ ์ธ์ž๋“ค์„ ์Šคํƒ์— ์ €์žฅํ•œ ๋’ค,
ํ”„๋กœ๊ทธ๋žจ์˜ main() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด์„œ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค๊ณ  ํ•ด๋ด…์‹œ๋‹ค:

$ ./test hello world
 

์šด์˜์ฒด์ œ๊ฐ€ main()์„ ํ˜ธ์ถœํ•  ๋•Œ ์‹ค์ œ๋กœ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ „๋‹ฌํ•ด์š”:

main(3, ["./test", "hello", "world"]);
 

 

๋ณ€์ˆ˜ ๊ฐ’ ์„ค๋ช…
argc 3 ์ธ์ž์˜ ๊ฐœ์ˆ˜ (argv[0], argv[1], argv[2])
argv[0] "./test" ์‹คํ–‰๋œ ํ”„๋กœ๊ทธ๋žจ ์ด๋ฆ„
argv[1] "hello" ์ฒซ ๋ฒˆ์งธ ์ธ์ž
argv[2] "world" ๋‘ ๋ฒˆ์งธ ์ธ์ž
argv[3] NULL ๋ฌธ์ž์—ด ๋ฐฐ์—ด์˜ ๋ ํ‘œ์‹œ

๐Ÿ’ก 4๏ธโƒฃ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ๊ด€๊ณ„

ํ•ญ๋ชฉ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋น„๊ณ 
argc, argv โŒ ์—†์Œ main() ์ธ์ž๋กœ ์ง์ ‘ ์ „๋‹ฌ๋จ
printf, atoi ๋“ฑ <stdio.h>, <stdlib.h> ์ธ์ž๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์ฆ‰, argc, argv๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ํ—ค๋”๋ฅผ includeํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ,
์ธ์ž๋ฅผ ์ถœ๋ ฅ(printf)ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ฐ”๊พธ๋ ค๋ฉด(atoi)
๊ทธ์— ๋งž๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ includeํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


โœ… 5๏ธโƒฃ ์š”์•ฝ ํ‘œ

ํ•ญ๋ชฉ์„ค๋ช…
์†Œ์† C ํ‘œ์ค€ main ํ•จ์ˆ˜์˜ ์ธ์ž (OS๊ฐ€ ์ „๋‹ฌ)
์ •์˜ ์œ„์น˜ ํ—ค๋” ํŒŒ์ผ ์•„๋‹˜ — ์‹คํ–‰ ์‹œ ์ž๋™ ์ „๋‹ฌ
์‚ฌ์šฉ ๋ชฉ์  ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ์ปค๋งจ๋“œ๋ผ์ธ ์ธ์ž ๋ฐ›๊ธฐ
์ž๋ฃŒํ˜• int argc, char *argv[] (๋˜๋Š” char **argv)
์ข…๋ฃŒ ๊ทœ์น™ argv[argc]๋Š” ํ•ญ์ƒ NULL ํฌ์ธํ„ฐ

โœ… ์ •๋ฆฌ ๋ฌธ์žฅ

argc์™€ argv๋Š” ํ—ค๋” ํŒŒ์ผ์—์„œ “์ œ๊ณต๋˜๋Š”” ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ,
์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ main() ํ•จ์ˆ˜๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์ธ์ž์ž…๋‹ˆ๋‹ค.
์ฆ‰, “ํ‘œ์ค€ C์˜ ์•ฝ์†๋œ ์ธํ„ฐํŽ˜์ด์Šค”๋ผ๊ณ  ๋ณด๋Š” ๊ฒŒ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.


โœ… ์ฆ‰, ๋„ค๊ฐ€ main()์„ ์ •์˜ํ•  ๋•Œ ์ธ์ž ์ด๋ฆ„์„ ์–ด๋–ป๊ฒŒ ์ง“๋“ ,
OS๋Š” ํ•ญ์ƒ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์—๋Š” ์ธ์ž ๊ฐœ์ˆ˜,
๋‘ ๋ฒˆ์งธ ์ธ์ž์—๋Š” ๋ฌธ์ž์—ด ๋ฐฐ์—ด ํฌ์ธํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์ „๋ถ€ ๋™๋“ฑํ•ด์š” ๐Ÿ‘‡

int main(int a, char *b[])
int main(int count, char **list)
int main(int banana, char *apple[])

์ด๋ฆ„์ด ๋‹ค ๋‹ฌ๋ผ๋„,
์šด์˜์ฒด์ œ๋Š” ํ•ญ์ƒ

  • ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ → ์ธ์ž์˜ ๊ฐœ์ˆ˜
  • ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ → ์ธ์ž๋“ค์˜ ๋ฐฐ์—ด ์ฃผ์†Œ

๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

 

โš ๏ธ 4๏ธโƒฃ ํ•˜์ง€๋งŒ “ํ˜•ํƒœ”๋Š” ์ค‘์š”ํ•จ

์ฆ‰, ์ž๋ฃŒํ˜•์˜ ํ˜•ํƒœ๋Š” ๋ฐ˜๋“œ์‹œ ๋งž์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์šด์˜์ฒด์ œ๋Š” main์„ “๊ทธ ํ˜•ํƒœ๋Œ€๋กœ” ํ˜ธ์ถœํ•˜๊ฑฐ๋“ ์š”.

โœ… ๋งž๋Š” ์˜ˆ:

int main(int argc, char *argv[])
 

โŒ ํ‹€๋ฆฐ ์˜ˆ (ํ˜•ํƒœ๊ฐ€ ์•ˆ ๋งž์Œ):

 
int main(char argc, char argv[])    // ์ž๋ฃŒํ˜• ๋ถˆ์ผ์น˜ → undefined behaviorโ€‹
 
 

โš™๏ธ ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋„ค๊ฐ€ ์ด๋ ‡๊ฒŒ ์ •์˜ํ•œ๋‹ค๋ฉด?

int main(int a, int b, int c)

 

์šด์˜์ฒด์ œ๋Š” ์—ฌ์ „ํžˆ
“main(int, char, char***)”** ํ˜•ํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, OS๋Š”

“a์—๋Š” ์ธ์ž ๊ฐœ์ˆ˜(int), b์—๋Š” argv ๋ฐฐ์—ด์˜ ์ฃผ์†Œ, c์—๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜(envp)์˜ ์ฃผ์†Œ”๋ฅผ ๋„˜๊ธธ ๊ฑฐ์˜ˆ์š”.


๐Ÿ” ์‹ค์ œ ํ˜ธ์ถœ ๊ตฌ์กฐ ์˜ˆ์‹œ (๋ฆฌ๋ˆ…์Šค ๊ธฐ์ค€)

OS ๋‚ด๋ถ€์—์„œ:

a ← argc (์˜ˆ: 4)
b ← argv์˜ ์ฃผ์†Œ (์˜ˆ: 0x7ffce3b2)
c ← envp์˜ ์ฃผ์†Œ (์˜ˆ: 0x7ffce3f0)

์ฆ‰,
b์™€ c๋Š” ์‚ฌ์‹ค “๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(ํฌ์ธํ„ฐ)”์ธ๋ฐ,
ํ”„๋กœ๊ทธ๋žจ์€ ๊ทธ๊ฑธ “์ •์ˆ˜”๋ผ๊ณ  ์ฐฉ๊ฐํ•ด์„œ ๋ฐ›์•„๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

 

โš ๏ธ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ์–ด๋–ค ์ผ์ด ์ƒ๊ธฐ๋‚˜?

์ƒํ™ฉ๊ฒฐ๊ณผ
a (int) ์ •์ƒ์ ์œผ๋กœ ์ธ์ž ๊ฐœ์ˆ˜(์˜ˆ: 4)๊ฐ€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ์Œ
b, c (int) ์›๋ž˜ ํฌ์ธํ„ฐ์˜€๋˜ ๊ฐ’์˜ “์ฃผ์†Œ ์ˆซ์ž๊ฐ’”์ด ๊ฐ•์ œ๋กœ ์ €์žฅ๋จ
ํ”„๋กœ๊ทธ๋žจ์—์„œ b, c๋ฅผ ์“ฐ๋ฉด ์˜๋ฏธ ์—†๋Š” ๊ฐ’, ์ ‘๊ทผ ์‹œ ์„ธ๊ทธํดํŠธ(segfault) ๋ฐœ์ƒ ๊ฐ€๋Šฅ

์ฆ‰, ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

 

๐Ÿง  ์ด์œ  ์š”์•ฝ

์šด์˜์ฒด์ œ๋Š” main์„ ํ˜ธ์ถœํ•  ๋•Œ ํ•ญ์ƒ

main(int, char **, char **)

ํ˜•ํƒœ๋กœ ์Šคํƒ์— ์ธ์ž๋ฅผ ์˜ฌ๋ ค๋†“๊ณ  ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋„ค๊ฐ€ main์„

main(int, int, int)

๋กœ ์„ ์–ธํ•˜๋ฉด,
์ž๋ฃŒํ˜• ํ•ด์„์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ์ ธ์š”.

  • ์ฒซ ๋ฒˆ์งธ ์ธ์ž(argc)๋Š” ์šด ์ข‹๊ฒŒ ๋งž์Œ
  • ๋‘ ๋ฒˆ์งธ ์ธ์ž(argv)๋Š” ์›๋ž˜ “๋ฌธ์ž์—ด ๋ฐฐ์—ด์˜ ์ฃผ์†Œ”์ธ๋ฐ
    → ํ”„๋กœ๊ทธ๋žจ์€ “๋‹จ์ˆœ ์ •์ˆ˜”๋กœ ํ•ด์„
  • ์„ธ ๋ฒˆ์งธ ์ธ์ž(envp)๋„ ํฌ์ธํ„ฐ์ธ๋ฐ
    → “์ •์ˆ˜ ๊ฐ’”์œผ๋กœ ํ•ด์„

์ฆ‰,
์‹คํ–‰์€ ๋˜์ง€๋งŒ ๋‚ด์šฉ์ด ๋‹ค ๊ผฌ์ž…๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ

#include <stdio.h>

int main(int a, int b, int c) {
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    return 0;
}

 

์‹คํ–‰

$ ./a.out hello
a = 2
b = 3273568912
c = 3273569120

 

  • a๋Š” ์šฐ์—ฐํžˆ ์ธ์ž ๊ฐœ์ˆ˜๊ฐ€ ๋งž๊ฒŒ ๋“ค์–ด๊ฐ”์ง€๋งŒ,
  • b, c๋Š” ์‚ฌ์‹ค argv, envp์˜ ์ฃผ์†Œ๊ฐ’์ด ์ •์ˆ˜๋กœ ์ฐํžŒ ๊ฒƒ๋ฟ์ด์—์š”.