셸에서 test -e 명령어와 같이 C언어 코드에서 파일 존재 여부를 확인할 수 있는 표준라이브러리 함수가 있을까요?
open() 해서 성공, 실패로 파일 존재를 확인했는데 다른 이유로 실패하는 경우도 있을테니 파일 존재 여부만 확인할 수 있었으면 좋겠습니다
access 함수에 F_OK Flag를 줘서 사용하시면 되지 않을까 싶습니다.
https://man7.org/linux/man-pages/man2/faccessat.2.html
test -e 명령어는 내부에서 stat 시스템 콜을 쓰네요..
$ strace test -e missfont.log execve("/usr/bin/test", ["test", "-e", "missfont.log"], 0x7ffe24583ec0 /* 56 vars */) = 0 brk(NULL) = 0x55c001de8000 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=216776, ...}) = 0 mmap(NULL, 216776, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f07f0b71000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\35\2\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=2030928, ...}) = 0 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f07f0b6f000 mmap(NULL, 4131552, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7f07f058c000 mprotect(0x7f07f0773000, 2097152, PROT_NONE) = 0 mmap(0x7f07f0973000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f07f0973000 mmap(0x7f07f0979000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f07f0979000 close(3) = 0 arch_prctl(ARCH_SET_FS, 0x7f07f0b70540) = 0 mprotect(0x7f07f0973000, 16384, PROT_READ) = 0 mprotect(0x55c001550000, 4096, PROT_READ) = 0 mprotect(0x7f07f0ba6000, 4096, PROT_READ) = 0 munmap(0x7f07f0b71000, 216776) = 0 brk(NULL) = 0x55c001de8000 brk(0x55c001e09000) = 0x55c001e09000 openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=4326016, ...}) = 0 mmap(NULL, 4326016, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f07f016b000 close(3) = 0 stat("missfont.log", {st_mode=S_IFREG|0664, st_size=320, ...}) = 0 close(1) = 0 close(2) = 0 exit_group(0) = ? +++ exited with 0 +++
끝 부분에
stat("missfont.log", {st_mode=S_IFREG|0664, st_size=320, ...}) = 0
요런 시스템 콜 호출이 보입니다. 만약 존재하지 않는 파일 일 때는
stat("missfont.loge", 0x7ffc28b9fb30) = -1 ENOENT (No such file or directory)
요렇게 리턴이 온다고 하네요..
그런데 access() 함수 쓰는게 아마 정석일겁니다..
---------------------- 얇은 사 하이얀 고깔은 고이 접어서 나빌레라
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
access 함수에 F_OK Flag를 줘서
access 함수에 F_OK Flag를 줘서 사용하시면 되지 않을까 싶습니다.
https://man7.org/linux/man-pages/man2/faccessat.2.html
stat
test -e 명령어는 내부에서 stat 시스템 콜을 쓰네요..
끝 부분에
요런 시스템 콜 호출이 보입니다.
만약 존재하지 않는 파일 일 때는
요렇게 리턴이 온다고 하네요..
그런데 access() 함수 쓰는게 아마 정석일겁니다..
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
댓글 달기