정기적으로 터미널에서 사용자 입력을받는 C++/Linux 서버를 구현하려고합니다. 처음에는이 동작을 처리하기 위해 두 개의 개별 스레드를 구현했습니다. 하지만 사용자가 서버를 종료하고자 할 때 서버 스레드를 취소하기 위해 pthread_cancel과 같은 것이 필요하다는 것을 알게되었습니다.select를 사용하여 stdin과 accept를 결합 할 수 있습니까?
그런 다음 동일한 스레드에서 두 작업을 모두 처리하는 것이 더 좋을 수 있으므로 리소스 유출에 대해 걱정할 필요가 없습니다. 그래서 제가 지금 가지고있는 것은 '표준'호출뿐입니다.이 호출은 표준 fd와 수락 fd를 선택합니다. 내 코드는 다음과 유사합니다 ...
fdset readfds;
FD_SET(acceptfd, &readfds);
FD_SET(stdinfd, &readfds);
while(1) {
select(n, &readfds, NULL, NULL, NULL);
....
}
나는 더 이상 표준 입력에서 입력을 읽을 수 없습니다. 이것은 내 fd 세트에서 두 fds 중 하나를 제거하면 잘 작동하고, 다른 ome는 예상대로 수행됩니다. 하지만 acceptfd가 들어오는 연결을 받아들이는 동안 둘 다 남겨두면 stdinfd는 터미널 입력에 응답하지 않습니다.
내가 여기 잘못하고 있을지 누가 알 수 있습니까? 이 접근 방식은 본질적으로 결함이 있습니까? 두 작업을 별도의 스레드로 유지하고 대신 깔끔하게 종료하는 방법을 찾는 데 집중해야합니까?
읽어 주셔서 감사합니다.
그것은 확실히 가능하다. 정확히 무슨 일이 일어나고있는거야? 몇개의 printf를 사이에 삽입하십시오. 파일 설명자를 비 블로킹 모드로 놓는 것을 잊었거나, 즉시 반환하는 대신 read() 또는 accept() 블록을 사용하지 않는 것이 좋습니다. –