본문 바로가기

Computer Science/Linux

[Linux] open()의 O_NONBLOCK 옵션

반응형

주로 시리얼 통신에서 많이 쓰이는 옵션인데요.

원문을 보자면

When opening a FIFO with O_RDONLY or O_WRONLY set: If O_NONBLOCK is set:
An open() for reading only will return without delay. An open() for writing only will return an error if no process currently has the file open for reading.
If O_NONBLOCK is clear:
An open() for reading only will block the calling thread until a thread opens the file for writing. An open() for writing only will block the calling thread until a thread opens the file for reading.
When opening a block special or character special file that supports non-blocking opens:
If O_NONBLOCK is set:
The open() function will return without blocking for the device to be ready or available. Subsequent behaviour of the device is device-specific.
If O_NONBLOCK is clear:
The open() function will block the calling thread until the device is ready or available before returning.
Otherwise, the behaviour of O_NONBLOCK is unspecified.

 

읽기 귀찮으신 분들을 위해 간단히 요약해서 말하면,


BLOCK 모드에서write 하는경우 : 다른 thread가 read로 파일을 읽을 때까지 기다림. read 하는경우 : 다른 thread가 write로 파일에 쓸 때까지 기다림.

NON BLOCK 모드에서

write 하는경우 : 다른 thread가 read상태로 기다리고 있지 않으면 에러 리턴으로 딜레이 없이 끝남.read 하는경우 : 읽을게 있으면 읽은 바이트 리턴하고, 없으면 -1 리턴, 둘다 딜레이 없이 바로 끝남.

 

 

 

시리얼 통신에서 예를 들어보겠습니다.

 

예시1 : O_NONBLOCK 옵션이 없는경우

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

res = read(fd, buf, 255);

 

이런식으로 데이터를 read하면 데이터가 들어올때까지 프로그램이 블락킹 상태가 됩니다. 프로그램이 멈춘다고 생각하는게 편하겠죠.

write의 경우에는 상대방이 read()로 들어갈 때까지 기다립니다.

 

 

예시2 : O_NONBLOCK 옵션이 있는경우 

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

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

 

반응형