pipe가 비어있는지 확인하는 함수가 있나요?
글쓴이: dgsquare / 작성시간: 일, 2005/05/22 - 7:46오후
pipe를 간단히 구현하고 있고요.
blocking/IO Mode로 사용하고 있습니다.
process간 전송은 pipe로 진행되고 있으며, 마지막 명령이 끝난 결과값을 화면으로 출력시켜주기 위하여, read하여 buffer로 보낸뒤 출력시킬려고 합니다.
근데, 어떤 명령들은 출력이 없습니다. 이렇게 출력이 없는상태에서 read가 일어나면 blocking되면서 누군가 pipe에 write할때까지 기다리는 것으로 알고 있습니다. 이런것을 처리하기 위해 read전에 pipe가 비어있는지 확인하고 싶은데 방법이 있나요?
알수가 없으면, 결국 flag를 설정해야 할것 같은데 로직이 복잡해질 것 같아서여 :shock:
결론은 pipe에서 read하기전에 비어있는지 확인하는 함수가 있는지 알고 싶습니다. 뭐 방법이라도 알려주시면 감사하구요-!
(매번 질문하기도 미안해 검색으로 찾아봤는데, 잘 안나오네여 ^^)
Forums:
ioctl(pipe, FIREADON, ...)이렇게 하면 안되나
ioctl(pipe, FIREADON, ...)
이렇게 하면 안되나요?
소켓에는 되는데 아마 파이프에도 될거 같네요
얼마나 읽을게 남아있나 확인해줄겁니다.
[quote]ioctl(pipe, FIREADON, ...) [/quot
죄송하지만 사용법이 어떻게 되는지..
manpage에도 없고, 검색을 해봐도 나오지 않네여..
poll 이나 select를 써서 읽기 전에 readable 한지 체크하
poll 이나 select를 써서 읽기 전에 readable 한지 체크하는건 어떨까요? -_-?;;
그 readable한지 알수 있는 방법이 없는지 알고 싶습니다-_-;
그 readable한지 알수 있는 방법이 없는지 알고 싶습니다-_-;
write할때마다 falg설정을 해주면 되지만, 로직이 많이 목잡해 지는것 같아서여.
어느 책에 얼핏 나온 것을 본것도 같은데, 도서관에서 찾아봐야겠습니다...
암튼, 답변감사합니다 :)
timeout 을 작게주고 select나 poll이 time expir
timeout 을 작게주고 select나 poll이 time expire로 종료하느냐 아니냐로 체크하면 되지 않을까여?
ioctl에서 FIONREAD였나 그 비슷한걸 써도 될꺼 같은데 그부분은 잘 기억이 -_-;;;
흠. ioctl과 FIONREAD에 대해서 검색해보시면 금방 아실 수 있
흠. ioctl과 FIONREAD에 대해서 검색해보시면 금방 아실 수 있었을텐데요...
int nbytes;
ioctl(fd, FIONREAD, &nbytes);
위 코드를 통해 해당 fd로부터 바로 읽어들일 수 있는 데이터가 몇 bytes인지
알 수 있습니다.
하지만 이렇게 체크하는 방법은 방법이 그다지 좋지 않다고 생각합니다.
command를 보내고 그에대한 결과가 있을 경우는 pipe에서 결과를 받아 출력
한다고 할 때, 결과가 있는지 없는지를 체크하기 위해서 pipe에 read할 데이터
가 있는지 체크해보는 것은 위험한 방법입니다. pipe 로부터 결과가 언제 올지
모르기 때문입니다. 결과가 올 command라면 당연히 read() 하고 있어야 하며
결과가 오지 않을 command라면 그냥 계속 진행하면 됩니다.
하지만 결과가 오지 않을 command라도 성공여부를 확인하고 싶다면 모든
command에 대하여 결과가 리턴되도록 프로토콜을 변경하시는 것이 좋을
것입니다. 복잡하게 고민하지 않아도 되며, 가장 확실하게 성공/실패를 알 수
있는 방법입니다. 오버헤드가 생각보다는 훨씬 작으므로 이렇게 하시는 것이
좋을 것입니다.
답변 감사합니다- 결국 다른 방식으로 짜게 되었지만,많은 도움이 되었
답변 감사합니다- 결국 다른 방식으로 짜게 되었지만,
많은 도움이 되었네여.
좀더 인내를 가지고 찾아보는 습관을 가져야 겠습니다. :)
댓글 달기