블록킹 read 와 논 블록킹 read 질문이요
글쓴이: mani85 / 작성시간: 화, 2011/07/12 - 2:45오후
분명 read()할때 옵션을 안주고 디폴트로 하면 blocking 모드라고 했는데요.
제가 가지고 있는 예제가 논블로킹 예제인데 read에서 디폴트로 되어있고요 실제로 논 블로킹모드로 작동하는건 왜 그런가요?
제 예상대로면 블로킹모드이기 때문에 read()에서 스위치가 안눌리면 멈춰야 하는데
계속 반복문이 수행됩니다. 디바이스 드라이버에서 꼭 interruptible_sleep_on()을 사용해요 프로세스가 멈추는건가요? read()에서도 읽을 데이터가 없으면 멈춰야 하는 거 아닌가요?
int main(void) { int i; int key_fd; int key_value[2]; /*Open device */ key_fd = open("/dev/key", O_RDONLY); if (key_fd < 0) { perror("APP: open device key"); exit(1); } for (;;) { int ret; /* start to read */ ret = read(key_fd, key_value, sizeof key_value); if (ret == sizeof key_value) { for (i = 0; i < 2; i++) { if (key_value[i]) { /* if pressed */ if(key_value[i] == 1) printf("APP: Left key pressed\n"); if(key_value[i] == 2) printf("APP: Right key pressed\n"); } } } else { /* let system get its breath back */ printf("...\n"); sleep(1); } } close(key_fd); return 0; }
Forums:
이런....
방금 여기저기 뒤적뒤적 거리다가 "비록 디바이스 파일을 블록킹 I/O 모드로 열었더라도 디바이스 드라이버가 블록킹 I/O를 구현하지 않았다면 프로세스는 잠들지 않는다" 라고 쓰여있네요..
하지만~ 이유가 안나와있어요 누가 이유 좀 설명해주세요
read(), write() 등은 실제로 디바이스
read(), write() 등은
실제로 디바이스 드라이버로 구현된 함수를 유저 레벨에서 호출하는 커널 API입니다.
"비록 디바이스 파일을 블록킹 I/O 모드로 열었더라도 디바이스 드라이버가 블록킹 I/O를 구현하지 않았다면 프로세스는 잠들지 않는다"
번역이 이상하긴 하지만,
말 그대로 read()를 호출했다고 하더라도 실행되는 것은 님이 작성한 디바이스 드라이버이기 때문에,
디바이스 드라이버에서 블록킹에 관련한 기능을 작성하지 않았다면,
당연히 블로킹이 되지 않습니다.
그냥 일반 함수처럼 쭉 실행하고 return 하고 나오죠.
커널 API와 디바이스드라이버의 관계는 간단합니다.
검색해 보시면 다 나옵니다.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
댓글 달기