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

[Linux/Unix][2-2] txt ํŒŒ์ผ ์ฝ๋Š” ํ”„๋กœ๊ทธ๋žจ, ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์‚ฌ์œ  ์ถœ๋ ฅ! perror()

by lxvxxu 2025. 10. 21.

 

์ด ์ฝ”๋“œ๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ unix.txt ํŒŒ์ผ์„ ‘์ฝ์„ ์ˆ˜ ์žˆ๋Š”์ง€’ ์ ๊ฒ€ํ•˜๊ณ ,

์ฝ๊ธฐ ๋ถˆ๊ฐ€๋ฉด ์›์ธ(์—๋Ÿฌ ๋ฉ”์‹œ์ง€)์„ ์ถœ๋ ฅํ•œ ๋’ค ๋น„์ •์ƒ ์ข…๋ฃŒ(์ฝ”๋“œ 1) ํ•˜๋Š” C ํ”„๋กœ๊ทธ๋žจ์ด์—์š”.

 

#include <errno.h>   // errno ์˜ค๋ฅ˜ ๋ฒˆํ˜ธ ์ƒ์ˆ˜/์ ‘๊ทผ
#include <unistd.h>  // access() ์„ ์–ธ
#include <stdio.h>   // perror(), printf ๋“ฑ
#include <stdlib.h>  // exit()

int main(void)
{
	if (access("unit.txt", R_OK) == -1) {
    	perror("unix.txt");
        exit(1);
    }
    return 0;
}

๋ฌด์—‡์„ ํ•˜๋‚˜์š”?

1. access("unix.txt", R_OK)๋กœ ์ฝ๊ธฐ ๊ถŒํ•œ(Readable, R_OK) ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ˜ํ™˜๊ฐ’์ด 0์ด๋ฉด ์ฝ๊ธฐ ๊ฐ€๋Šฅ, -1์ด๋ฉด ์ฝ๊ธฐ ๋ถˆ๊ฐ€์ด๋ฉฐ errno์— ์‹คํŒจ ์›์ธ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

access(path, mode): ํŒŒ์ผ ์กด์žฌ/๊ถŒํ•œ์„ “์‹ค์ œ(real) UID/GID” ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์‚ฌ

  • F_OK: ์กด์žฌ ์—ฌ๋ถ€
  • R_OK: ์ฝ๊ธฐ ๊ถŒํ•œ
  • W_OK: ์“ฐ๊ธฐ ๊ถŒํ•œ
  • X_OK: ์‹คํ–‰ ๊ถŒํ•œ

2. ์ฝ๊ธฐ ๋ถˆ๊ฐ€(-1)์ผ ๋•Œ:

  • perror("unix.txt")๊ฐ€ "unix.txt: <์˜ค๋ฅ˜์„ค๋ช…>" ํ˜•์‹์œผ๋กœ ์‚ฌ์œ ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜„์žฌ errno ๊ฐ’์„ ํ•ด์„ํ•ด "prefix: strerror(errno)"๋ฅผ ํ‘œ์ค€์—๋Ÿฌ๋กœ ์ถœ๋ ฅ
  • exit(1)๋กœ ๋น„์ •์ƒ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž์—๊ฒŒ ์‹คํŒจ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์ข…๋ฃŒ

3.  ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด return 0;์œผ๋กœ ์ •์ƒ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

 

 

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

 

์ˆ˜ํ–‰ ๊ฒฐ๊ณผ ํ”„๋กœ๊ทธ๋žจ์ด access("unix.txt", R_OK)๋ฅผ ํ˜ธ์ถœํ–ˆ์œผ๋‚˜ ์‹คํŒจํ–ˆ๋‹ค.

errno๊ฐ€ ENOENT(ํ•ด๋‹น ํŒŒ์ผ์ด๋‚˜ ๊ฒฝ๋กœ ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ)๋กœ ์„ค์ •๋๋‹ค.

perror("unix.txt")๊ฐ€ ์ด๋ฅผ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์‹œ์ง€๋กœ ์ถœ๋ ฅํ•œ ๊ฒƒ์ด “unix.txt: No such file or directory”์ธ ๊ฒƒ์ด๋‹ค.

์˜ค๋ฅ˜ ๋‚ด์šฉ์€ ๋ฌธ์žฅ ๊ทธ๋Œ€๋กœ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ์— unix.txt ํŒŒ์ผ์ด ์กด์žฌํ•˜์ง€ ์•Š์•„์ฝ๊ธฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์ ๊ฒ€ํ•  ์ˆ˜ ์—†์—ˆ๊ณ ,

ํ”„๋กœ๊ทธ๋žจ์€ exit(1)๋กœ ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜์—ˆ๋‹ค

 

 

์‹คํ–‰ ์˜ˆ์‹œ

ํŒŒ์ผ์ด ์—†์„ ๋•Œ:

$ ./a.out
unix.txt: No such file or directory
$ echo $?    # ์ข…๋ฃŒ ์ฝ”๋“œ ํ™•์ธ
1

 

ํŒŒ์ผ์€ ์žˆ์œผ๋‚˜ ์ฝ๊ธฐ ๊ถŒํ•œ์ด ์—†์„ ๋•Œ :

$ ./a.out
unix.txt: Permission denied
$ echo $?
1

 

์ฝ๊ธฐ ๊ฐ€๋Šฅํ•  ๋•Œ:

$ ./a.out
$ echo $?
0

 

 

์•Œ์•„๋‘๋ฉด ์ข‹์€ ์ 

  • access()๋Š” ์‹ค์ œ(real) ์‚ฌ์šฉ์ž/๊ทธ๋ฃน ID ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค. SUID ํ”„๋กœ๊ทธ๋žจ ๋“ฑ์—์„œ๋Š” ์œ ํšจ(effective) ID์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์–ด์š”.
  • ๋ณด์•ˆ์ ์œผ๋กœ๋Š” TOCTTOU(์ฒดํฌ-์‚ฌ์šฉ ๊ฐ„ ๊ฒฝ์Ÿ) ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ,
    “์ฝ์„ ์ˆ˜ ์žˆ๋‚˜ ํ™•์ธ → ๋‚˜์ค‘์— ์—ด๊ธฐ”๋ณด๋‹ค๋Š” ๋ฐ”๋กœ open()/fopen()์„ ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ ์ฒ˜๋ฆฌํ•˜๋Š” ํŒจํ„ด์ด ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹คํŒจ ์‹œ ์ž์ฃผ ๋งŒ๋‚˜๋Š” errno ๊ฐ’
    • ENOENT(2): ํŒŒ์ผ/๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์—†์Œ
    • EACCES(13): ๊ถŒํ•œ ์—†์Œ
    • ENOTDIR, ELOOP, ENAMETOOLONG ๋“ฑ ๊ฒฝ๋กœ ๋ฌธ์ œ