이 름
fcntl − 파 일 기 술 자 (file descriptor) 조 작
사 용 법
#include
<unistd.h>
#include <fcntl.h>
int
fcntl(int fd, int cmd);
int fcntl(int fd, int cmd,
long arg);
int fcntl(int fd, int cmd,
struct flock * lock);
설 명
fcntl fd에 서 다 양 한 연 산 들 중 하 나 를 수 행 한 다 . 문 제 중 연 산 은 cmd에 의 해 결 정 된 다 :
F_DUPFD |
arg보 다 크 거 나 동 일 한 가 장 낮 은 숫 자 가 지 명 된 사 용 가 능 한 파 일 기 술 자 를 찾 고 , 그 것 이 fd의 복 사 본 이 되 도 록 하 라 . 이 는 엄 밀 하 게 지 정 된 기 술 자 를 사 용 하 는 dup2(2)와 는 다 르 다 . |
오 래 된 그 리 고 새 로 운 기 술 자 들 은 교 대 적 으 로 사 용 될 수 있 다 . 이 들 은 잠 금 (lock), 파 일 위 치 포 인 터 그 리 고 플 래 그 를 공 유 한 다 . 예 를 들 면 , 기 술 자 들 중 하 나 에 서 파 일 위 치 가 lseek를 사 용 해 서 수 정 되 면 , 위 치 는 또 한 다 른 것 에 대 해 변 경 될 수 있 다 .
두 기 술 자 들 은 close-on-exec 플 래 그 를 공 유 하 지 않 는 다 . 그 러 나 복 제 본 의 close-on-exec 플 래 그 는 실 행 중 에 는 종 료 되 지 않 는 off 상 태 가 된 다 .
성 공 하 면 , 새 로 운 기 술 자 는 리 턴 된 다 .
F_GETFD |
close-on-exec를 읽 는 다 . 만 일 FD_CLOEXEC 비 트 가 0이 면 , 파 일 은 exec를 통 해 열 린 상 태 로 남 겨 지 고 , 그 렇 지 않 으 면 , 닫 힌 다 . | ||
F_SETFD |
close-on-exec 플 래 그 를 arg의 FD_CLOEXEC 비 트 에 의 해 지 정 된 값 으 로 설 정 한 다 . | ||
F_GETFL |
기 술 자 의 플 래 그 를 읽 는 다 . (모 든 플 래 그 ( open(2)에 의 해 설 정 된 )들 은 리 턴 된 다 .) | ||
F_SETFL |
arg 에 의 해 지 정 된 값 을 기 술 자 의 플 래 그 로 설 정 한 다 . 오 직 O_APPEND, O_NONBLOCK 그 리 고 O_ASYNC 이 설 정 될 수 있 다 . 다 른 플 래 그 들 은 영 향 을 받 지 않 는 다 . |
플 래 그 들 은 dup(2), fork(2) 로 만 들 어 진 동 일 한 파 일 기 술 자 의 복 사 본 들 사 이 에 공 유 된 다 .
플 래 그 및 그 들 의 의 미 는 open(2)에 설 명 되 어 있 다 .
F_GETLK,
F_SETLK 그 리 고 F_SETLKW
들 은 임 의 의 파
일 잠 금 을 관 리
하 는 데 사 용 된
다 . 세 번 째 인 수
lock은 구 조 체
flock(이 호 출 에 의 해
겹 쳐 써 질 수 있
는 )에 대 한 포 인
터 이 다 .
F_GETLK
잠 금 을
얻 을 수 없 도 록
제 어 하 는 flock 구 조
로 리 턴 하 거 나 ,
다 른 장 애 가 없
다 면 ,
잠 금 의 l_type 필 드
를 F_UNLCK으 로 설 정
한 다 .
F_SETLK
l_type이 F_RDLCK 혹 은 F_WRLCK일 때 , 잠 금 이 설 정 된 거 나 , l_type이 F_UNLCK일 때 , 잠 금 은 소 거 된 다 . 다 른 누 군 가 에 의 해 잠 금 (lock)이 이 루 어 지 면 , 이 호 출 은 -1을 리 턴 하 고 , errno를 EACCES 혹 은 EAGAIN로 설 정 한 다 .
F_SETLKW
F_SETLK과 같 지 만 , 에 러 를 리 턴 하 는 대 신 에 , 잠 금 이 풀 려 지 기 를 기 다 린 다 . 만 일 fcntl이 기 다 리 고 있 을 때 , 시 그 널 이 잡 히 면 , 이 는 인 터 럽 트 되 고 , 시 그 널 처 리 기 가 리 턴 된 후 에 , 즉 시 리 턴 값 -1과 errno가 EINTR로 설 정 되 어 리 턴 된 다 .
F_GETOWN,
F_SETOWN, F_GETSIG 그 리 고
F_SETSIG 입 출 력 (I/O) 유
용 성 시 그 널 을
관 리 하 는 데 사
용 된 다 .
F_GETOWN
파 일 기 술 자 fd상 에 서 이 벤 트 들 에 대 한 SIGIO 그 리 고 SIGURG 시 그 널 들 을 수 신 하 는 프 로 세 스 ID 또 는 프 로 세 스 그 룹 을 얻 는 다 .
F_SETOWN
파 일 기 술 자 fd상 에 서 이 벤 트 들 에 대 한 SIGIO 그 리 고 SIGURG 시 그 널 들 을 수 신 하 는 프 로 세 스 ID 또 는 프 로 세 스 그 룹 을 설 정 한 다 . 프 로 세 스 그 룹 들 은 음 수 값 을 사 용 하 여 지 정 된 다 . (F_SETSIG 은 SIGIO 대 신 에 다 른 시 그 널 을 명 시 하 는 데 사 용 될 수 있 다 . 만 일 파 일 기 술 자 에 서 이 플 래 그 에 open(2) 호 출 을 제 공 하 거 나 , fcntl의 F_SETFL 명 령 을 사 용 하 여 O_ASYNC 상 태 플 래 그 를 설 정 하 려 면 , 입 력 또 는 출 력 이 그 파 일 기 술 자 에 서 가 능 하 게 될 때 마 다 , SIGIO 시 그 널 이 전 송 된 다 .
시 그 널 을 수 신 할 프 로 세 스 혹 은 프 로 세 스 그 룹 은 fcntl 함 수 에 대 한 F_SETOWN 명 령 을 사 용 함 으 로 서 선 택 될 수 있 다 . 만 일 파 일 기 술 자 가 소 켓 이 면 , 이 는 또 한 대 여 폭 을 벗 어 난 데 이 터 가 그 소 켓 에 도 착 할 때 전 달 되 는 SIGURG 시 그 널 의 수 신 자 를 선 택 한 다 . (SIGURG는 select(2)는 소 켓 을 "예 외 적 인 조 건 "으 로 보 고 하 는 어 떤 상 황 에 서 든 전 송 된 다 . 만 일 파 일 기 술 자 가 터 미 널 장 치 와 일 치 한 다 면 , SIGIO 시 그 널 들 은 터 미 널 의 포 그 라 운 드 프 로 세 스 그 룹 에 전 송 된 다 .
F_GETSIG
입 력 또 는 출 력 이 가 능 해 질 때 , 시 그 널 이 전 송 되 도 록 한 다 . 제 로 값 은 SIGIO가 전 송 되 었 다 는 것 을 의 미 한 다 . 다 른 값 (SIGIO을 포 함 )은 대 신 보 내 진 시 그 널 이 다 . 이 런 경 우 , SA_SIGINFO가 설 치 되 어 있 으 면 , 시 그 널 처 리 기 에 대 한 추 가 적 인 정 보 가 사 용 가 능 하 다 .
F_SETSIG
입 력 또 는 출 력 이 가 능 해 질 때 , 시 그 널 이 전 송 되 도 록 설 정 한 다 . 제 로 값 은 디 폴 트 SGSIO 시 그 널 을 전 송 하 는 것 을 의 미 한 다 . 다 른 값 (SIGIO을 포 함 )은 대 신 보 내 진 시 그 널 이 다 . 이 런 경 우 , SA_SIGINFO가 설 치 되 어 있 으 면 , 시 그 널 처 리 기 에 대 한 추 가 적 인 정 보 가 사 용 가 능 하 다 .
제 로 가 아 닌 값 으 로 F_SETSIG을 사 용 하 고 , 시 그 널 처 리 기 에 대 한 SA_SIGINFO를 설 정 ( sigaction(2) 참 조 할 것 )함 으 로 서 , 입 출 력 (I/O 이 벤 트 에 대 한 ) 기 타 정 보 가 siginfo_t 내 의 처 리 기 로 전 달 된 다 . si_code 필 드 는 소 스 가 SI_SIGIO라 는 것 을 가 리 키 고 , si_fd 필 드 는 파 일 기 술 자 와 이 벤 트 를 관 련 시 킨 다 . 그 렇 지 않 으 면 , 어 떤 파 일 기 술 자 들 이 계 류 중 인 가 에 대 한 지 시 가 없 고 , 여 러 분 은 입 출 력 (I/O)에 사 용 가 능 한 파 일 기 술 자 들 이 어 떤 것 인 지 를 결 정 하 기 위 해 유 용 한 메 커 니 즘 ( (select(2), poll(2), read(2) O_NONBLOCK )을 사 용 해 야 한 다 .
POSIX.1b 실 시 간 시 그 널 (값 >= SIGRTMIN)을 선 택 함 으 로 서 , 다 중 입 출 력 이 벤 트 들 은 동 일 한 시 그 널 넘 버 들 을 사 용 하 여 대 기 행 렬 (큐 )에 넣 을 수 있 다 . (큐 는 보 통 사 용 가 능 한 메 모 리 에 의 존 적 이 다 .) 위 와 같 이 시 그 널 처 리 기 에 대 해 SA_SIGINFO가 설 정 되 면 , 기 타 정 보 가 사 용 가 능 하 다 .
이 러 한 메 커 니 즘 을 사 용 하 면 , 프 로 그 램 은 대 부 분 의 시 간 을 select(2) 혹 은 poll(2)을 사 용 함 없 이 , 비 동 기 적 입 출 력 (I/O)을 구 현 할 수 있 다 .
O_ASYNC, F_GETOWN, F_SETOWN 의 사 용 은 BSD 및 리 눅 스 에 특 정 적 이 다 . F_GETSIG 와 F_SETSIG는 리 눅 스 에 만 특 정 적 이 다 . POSIX는 비 슷 한 것 들 을 이 루 는 데 비 동 기 적 입 출 력 과 aio_sigevent 구 조 를 이 용 한 다 . 이 러 한 것 들 은 또 한 리 눅 스 에 서 GNU C 라 이 브 러 리 (Glibc)의 부 분 으 로 서 사 용 할 수 있 다 .
반 환 값
성 공 적 인 호 출 에 대 하 여 , 리 턴 값 은 연 산 에 의 존 적 이 다 .
F_DUPFD |
새 로 운 기 술 자 | ||
F_GETFD |
플 래 그 의 값 | ||
F_GETFL |
플 래 그 의 값 | ||
F_GETOWN |
기 술 자 소 유 자 의 값 | ||
F_GETSIG |
읽 기 또 는 쓰 기 가 가 능 해 졌 을 때 전 송 된 시 그 널 의 값 이 나 , 전 통 적 인 SIGIO 행 위 에 대 한 zero. |
다 른 모 든 명 령 어
Zero.
에 러 면 , −1이 리 턴 되 고 , errno는 적 절 하 게 설 정 된 다 .
에 러
EACCES |
연 산 은 다 른 프 로 세 스 에 의 한 잠 김 에 의 해 금 지 된 다 . | ||
EAGAIN |
파 일 이 다 른 프 로 세 스 에 의 해 메 모 리 매 핑 이 되 었 기 때 문 에 , 연 산 은 방 해 받 는 다 . | ||
EBADF |
fd는 열 린 파 일 기 술 자 가 아 니 다 . | ||
EDEADLK |
지 정 된 F_SETLKW 명 령 은 Deadlock을 초 래 할 것 이 라 는 것 이 감 지 되 었 다 . | ||
EFAULT |
lock은 여 러 분 이 접 근 할 수 있 는 주 소 공 간 의 바 깥 에 있 다 . | ||
EINTR |
F_SETLKW에 대 하 여 , 명 령 은 시 그 널 에 의 해 인 터 럽 트 되 었 다 . F_GETLK과 F_SETLK에 대 하 여 , 명 령 은 잠 김 이 체 크 되 거 나 , 이 루 어 지 기 전 에 시 그 널 에 의 해 인 터 럽 트 되 었 다 . 원 격 파 일 을 잠 그 는 (NFS 잠 금 ) 것 은 보 통 로 컬 에 서 발 생 한 다 . | ||
EINVAL |
F_DUPFD에 대 하 여 , arg은 음 수 값 이 거 나 , 허 용 된 최 대 값 보 다 는 크 다 . F_SETSIG에 대 하 여 , arg은 허 용 될 수 있 는 시 그 널 넘 버 가 아 니 다 . | ||
EMFILE |
F_DUPFD에 대 하 여 , 프 로 세 스 는 이 미 파 일 기 술 자 들 의 최 대 넘 버 가 열 리 도 록 한 다 . | ||
ENOLCK |
너 무 나 많 은 시 그 먼 트 잠 금 이 열 렸 고 , 잠 금 테 이 블 은 꽉 찼 거 나 , 원 격 잠 금 프 로 토 콜 이 실 패 하 였 다 . (NFS를 통 해 잠 그 기 ) | ||
EPERM |
추 가 속 성 이 지 정 되 도 록 하 는 파 일 에 서 O_APPEND 플 래 그 를 소 거 하 고 자 함 |
주 의
dup2에 의 해 리 턴 된 에 러 들 은 F_DUPFD에 의 해 리 턴 된 에 러 들 과 는 다 르 다 .
호 환
SVr4, SVID,
POSIX, X/OPEN, BSD 4.3. 오 직 F_DUPFD, F_GETFD,
F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK 그
리 고 F_SETLKW의 연 산
들 만 이 POSIX.1내 에 명
시 되 어 있 다 . F_GETOWN
과 F_SETOWN 들 은 SVr4에 서
지 원 되 지 않 는
BSDism이 다 .
F_GETSIG 과 F_SETSIG는 리 눅
스 에 특 정 적 이
다 . F_GETFL/F_SETFL용 플 래
그 들 은 open(2)에 의
해 지 원 되 는 플
래 그 들 이 고 , 시
스 템 에 따 라 다
르 다 . O_APPEND, O_NONBLOCK, O_RDONLY, 그
리 고 O_RDWR은 POSIX.1내 에
명 시 되 어 있 다 .
SVr4은 여 기 에 서 문
서 화 하 지 않 은
몇 개 의 다 른 옵
션 들 과 플 래 그
를 지 원 한 다 .
SVr4는 추 가 적 인 EIO, ENOLINK 그 리 고 EOVERFLOW 에 러 조 건 들 에 대 한 문 서 화 를 한 다 .
관 련 항 목
dup2(2), open(2), socket(2), flock(2)
번 역
ASPLINUX
<man [AT] asp-linux.kr> 2000년 7월
29일
한 글 Manpage 프 로 젝
트 (http://man.kldp.org) 2005년 2월
17일