Skip to content

POSIX:fcntl

Syntax

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* arg */ );

open

Flags

열기 옵션

옵션 설명

O_RDONLY

읽기 전용응로 열기

O_WRONLY

쓰기 전용으로 열기

O_RDWR

읽기와 쓰기가 모두 가능

O_CREAT

해당 파일이 없으면 생성합니다.

O_EXCL

O_CREAT를 사용했을 때, 파일이 이미 있어도 열기가 가능하여 쓰기를 하면 이전 내용이 사라집니다.

O_TRUNC

기존의 파일 내용을 모두 삭제합니다.

O_APPEND

파일을 추가하여 쓰기가 되도록 open 후에 쓰기 포인터가 파일의 끝에 위치하게 됩니다.

O_NOCITTY

열기 대상이 터미널일 경우, 이 터미널이 플로그램의 제어 터미널로 할당하지 않습니다. (데이터 전송 시에 CTRL-C 문자가 오면 프로그램이 종료되지 않도록 하기 위해 Controlling TTY 가 안되도록 한다)

O_NONBLOCK

읽을 내용이 없을 때에는 읽을 내용이 있을 때까지 기다리지 않고 바로 복귀합니다.

O_SYNC

쓰기를 할 때, 실제 쓰기가 완료될 때 까지 기다립니다. 즉, 물리적으로 쓰기가 완료되어야 복귀하게 됩니다.

O_NONBLOCK

BLOCK 모드에서
write 하는경우 - 다른 thread가 read로 파일을 읽을 때까지 기다림.
read 하는경우 - 다른 thread가 write로 파일에 쓸 때까지 기다림.
NON BLOCK 모드에서
write 하는경우 - 다른 thread가 read상태로 기다리고 있지 않으면 에러 리턴으로 딜레이 없이 끝남.
read 하는경우 - 읽을게 있으면 읽은 바이트 리턴하고, 없으면 -1 리턴, 둘다 딜레이 없이 바로 끝남.

시리얼 통신에서 예를 들어보겠습니다. O_NONBLOCK 옵션이 없는경우:

fd = open( "/dev/ttyS3", O_RDWR | O_NOCTTY );

res = read(fd, buf, 255);

이런식으로 데이터를 read() 하면 데이터가 들어올때까지 프로그램이 블락킹 상태가 됩니다. 프로그램이 멈춘다고 생각하는게 편하겠죠. write() 의 경우에는 상대방이 read() 로 들어갈 때까지 기다립니다.

O_NONBLOCK 옵션이 있는경우:

fd = open( "/dev/ttyS3", O_RDWR | O_NOCTTY | O_NONBLOCK );

res = read(fd, buf, 255);

데이터가 있든 없든 기다리지 않고 나옵니다. 읽을 데이터가 있으면 읽어온 데이터를 buf 에 기록하고, res에 읽어온 바이트 수를 리턴하죠. 없다면 res로 -1을 리턴합니다. write() 의 경우에도 read() 와 같은 방식으로 동작합니다.

fcntl

manipulate file descriptor.

PIPE_BUF

자세한 내용은 Named pipe#PIPE_BUF 항목 참조.

See also

Favorite site