Computer Science/Linux
[Linux] open()의 O_NONBLOCK 옵션
yesbaby.
2014. 7. 15. 17:38
반응형
주로 시리얼 통신에서 많이 쓰이는 옵션인데요.
원문을 보자면
When opening a FIFO with O_RDONLY or O_WRONLY set: If O_NONBLOCK is set:
If O_NONBLOCK is set:
|
읽기 귀찮으신 분들을 위해 간단히 요약해서 말하면,
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와 같은 방식으로 동작합니다.
반응형