• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    해결됨

프로그램 동작 질문입니다!

20.04.07 23:40 작성 조회수 118

2

while문 안에서 read로 fd에 있는 이벤트들을 읽는데 이때 프로세스가(아직 이벤트가 발생하지 않았음에도) 종료되지 않고 기다리는 것은  inotify_init()할 때 플래그를 주지 않아 blocking으로 생성되었기 때문인가요?

그리고 inotify_add_watch함수 호출하면 해당 디렉토리를 감시하는 새로운 쓰레드를 생성하는 건가요?

마지막으로 fd가 blocking으로 열렸을 때 read가 0을 반환할 수 있나요? 그러니까 blocking으로 열리면 read에서 값이 생성될 때까지 기다리는데 생성된 값의 바이트 수가 0일 수 있나요?

좋은 강의 감사드립니다!!

답변 1

답변을 작성해보세요.

1

안녕하세요. Mk H님. 답변 드리겠습니다.

A1. 맞습니다. 리눅스의 I/O는 기본적으로 blocking mode 입니다. inotify_init()시에 non-blocking option을 주지 않았기 때문에 blocking I/O를 하는 것 입니다.그래서 이벤트가 발생할 때까지 기다리게 됩니다.

A2. inotify_add_watch 함수를 호출했다고 새로운 쓰레드가 생성되지는 않습니다. 프로세스는 리눅스 커널이 I/O 이벤트가 일어났다는 것을 기다리는 것이고, 이벤트가 발생했음을 알려주는 것은 리눅스 커널의 몫 입니다. add_watch()를 하면 커널이 감시해야할 파일이 추가된 것이지 쓰레드가 생성되는 것은 아닙니다.

A3. 없다고 보시면 될 것 같습니다. 근래의 커널에서는 signal에 의해 interrupt 되더라도 에러를 리턴하도록 되어있기 때문에 거의 없다고 보셔도 될 것 같습니다. 하지만 return value는 반드시 확인하셔야 합니다.^^

좋은 질문 감사드려요~ :D