์ด ์ฝ๋๋ ํ์ฌ ํ๋ก์ธ์ค๊ฐ 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 ๋ฑ ๊ฒฝ๋ก ๋ฌธ์