FIFO를 읽을때 무한루프 안돌리고 블럭시킬수 없나요?
글쓴이: 마왕 / 작성시간: 토, 2004/06/05 - 8:03오후
숙제를 하고 있습니다.
C-S 아키텍쳐를 간소하게나마 흉내내보자는 것이 주제인데요.
서버는 well-kwown FIFO를 만들어놓고 FIFO에 입력이 들어오길 기다립니다.
클라이언트가 well-known FIFO에 request를 보내면
서버는 포크를해서,
자식놈은 이미 클라이언트가 만들어 둔 client-specific FIFO에 응답을 보내고
어미는 계속 입력을 기다립니다.
물론 서버와 클라이언트는 로컬머신 상에 있습니다.
정말 간단한 구조입니다.
그래서 이미 다 짰습니다.
그런데 문제가 뭐냐....
서버에서 무한루프를 돌면서 CPU를 100%잡아먹는다는 것입니다.
이렇게 말이죠.
well-known_fd = open(well-known_FIFO, O_NONBLOCK); ... while(1) { read(well-known_fd, buf, bufsize); ... fork(); ... }
뭐.. CPU가 100%나온다고 해서 낙제점을 받는다거나 하는 것은 아니지만
뭔가 찝찝합니다.
제가 원다는 것을 다시 말씀드리면,
while loop속에서 read를 만나면,
well-known FIFO에 입력이 들어올때까지 server process가 block되는 것입니다.
고수님들의 답변을 부탁드립니다.
Forums:
몬지 정확하게는 모르겠지만 ..cpu 100% 피하는 건 대개,s
몬지 정확하게는 모르겠지만 ..
cpu 100% 피하는 건 대개,
sleep 넣어주면 되지 않나요 ?..
select쓰면 되지않을까요?
select쓰면 되지않을까요?
[quote]그런데 문제가 뭐냐.... 서버에서 무한루프를 돌면서 C
나와야 된다는건지
나오지말아야 된다는건지 ㅎㅎ :)
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
FIFO를 읽을때 무한루프 안돌리고 블럭시킬수 없나요?목적이 100%
FIFO를 읽을때 무한루프 안돌리고 블럭시킬수 없나요?
목적이 100%를 없애려한다면 Blocking 모드로 오픈하시면 될텐데요 ㅎㅎ.
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
시스템콜(read, write) 등의 모든 에러처리를 하고 계신가요? p
시스템콜(read, write) 등의 모든 에러처리를 하고 계신가요? perror 등을 통해 에러를 확인해보시기 바랍니다.
---
http://coolengineer.com
open할때 block모드로 열면 맨 첨에 첫번째 request받을때 까
open할때 block모드로 열면 맨 첨에 첫번째 request받을때 까지는
block되어 있습니다만
첫번째 request를 받고 나서는 다시 loop를 돌면서 CPU 100%가 되더군요
select를 쓰시라는 말씀에 select man page를 잠깐 봤는데요..
확실히 select를 쓰면 될것같습니다만,
select를 쓰지않고 해결할 수 있는 방법이 없을까요.
제가 뭘 모르긴 모르고 있는거 같은데....
해랑사. 해랑사. 잊을 수 있는 얘길 해줘..
pipe가 close되어있는데 close된지 모르고 계속 돌아가고 있는것
pipe가 close되어있는데 close된지 모르고 계속 돌아가고 있는것 같습니다.
---
http://coolengineer.com
[quote="pynoos"]시스템콜(read, write) 등의 모든
무한루프를 돌면서 read()를 하면서 클라이언트의 요청을 대기할때의
errno값은 0이고
perror는 illegal seek이라는 메시지를 내뱉습니다.
그때의 read()의 리턴값은 0이구요.
아무래도 좀 더 공부해야될것같습니다.
답글달아주신분들 고맙습니다. :roll:
해랑사. 해랑사. 잊을 수 있는 얘길 해줘..
read의 return 값이 0 이면 이미 종료된 것입니다.함수 에러
read의 return 값이 0 이면 이미 종료된 것입니다.
함수 에러처리는 모두 된 다음 디버깅하는 것이 좋은 습관이지요.
---
http://coolengineer.com
댓글 달기