C 언어에서 상대 경로를 현재 작업 디렉터리가 아닌 특정 디렉터리 아래에서 열고 싶을 때 openat()을 쓴다.
작게 실행해 보기
#define _GNU_SOURCE
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void) {
int dirfd = open("/dev", O_RDONLY | O_DIRECTORY);
if (dirfd < 0)
return 1;
int fd = openat(dirfd, "null", O_RDONLY);
if (fd < 0) {
close(dirfd);
return 1;
}
printf("fd=%d\n", fd);
close(fd);
close(dirfd);
return 0;
}/dev를 기준 디렉터리로 열고 그 아래 null을 연다. 현재 작업 디렉터리를 바꾸지 않고 상대 경로의 기준을 명시한다.
반환값과 주의점
성공하면 새 파일 디스크립터, 실패하면 -1이다. 반환한 번호는 사용 후 close()로 닫는다.
dirfd에는 기준 디렉터리를 연 번호를 넣는다. AT_FDCWD를 넣으면 현재 디렉터리 기준이며, 절대 경로라면 일반적으로 dirfd는 사용하지 않는다.
예제 실행 방법
gcc -std=c11 -Wall -Wextra example.c -lm -o example
./example
답글 달기