[완료] 터미널에서 아무 입력이나 발생시 발생하는 시그널이 있나요?
글쓴이: fastwater / 작성시간: 화, 2010/11/23 - 12:26오후
터미널에서 아무 입력이나 발생시 발생하는 시그널이 있는지 궁금합니다.
Ctrl+C는 SIGINT 를 발생시키고
각각 몇몇 특정 키들은 특정 시그널을 발생 시키는 것으로 알고 있습니다만 현재 과제를 하는 도중
서버를 만들고, 서버를 종료할 때 특정 문자열을 입력 받으면 서버를 종료하도록 구현을 하려 합니다. 현재는 쓰레드를 하나 만들어서 while 루프로 fgets를 계속 돌리도록 했습니다만 뭔가 이건 좀 아니다 싶은 생각이 들어서 말이죠.
아무런 키보드 입력이 들어오면 시그널 처리 함수로 가서 fgets나 read로 버퍼에 stdin에 기록된 값을 읽어들이려면 어떻게 해야 할까요?
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
답변 감사합니다. 그런데 select 함수를 보니 파일 디스크립터의 움직임을 관찰하는 함수 같은데 이걸 어디다 쓰는지 감이 안잡히네요;
원래 질문의 요지는
터미널에 뭔가 입력이 들어옴 -> 뭔가 시그널이 발생 -> stdin에 있는 데이터를 버퍼에 저장
이었습니다. 물론 메인 함수는 다른거 하느라고 바빠서 다른 뭔가가 처리를 해줘야 겠죠.
현재는 쓰레드로 입력 받는 루프 하나 더 만들어서 구현했습니다. 어떻게 하는게 정상적인 방법일까요?
Forums:
음 ..
man select 해보시면 EXAMPLE 에 stdin 을 모니터링하는 예제 코드가 있을겁니다.
그냥 보편적인게 무난한 방법 아닐까 싶네요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
감사합니다.
select가 뭔지도 모르는 참이라 이상한 방식으로 구현을 하려 했었네요 ㅎㅎ;
io가 있을 때 SIGIO signal을 받을 수 있는것 같습니다.
io가 있을 때 SIGIO signal을 받을 수 있는것 같습니다. 직접 써보진 않아서...
http://www.makelinux.net/ldd3/chp-6-sect-4.shtml
답변 감사합니다.
그런데 SIGIO는 뭔가 다른데 쓰는 시그널 같아요;; 해보니까 잘 안되네요.
콘솔에서도 잘 동작합니다.
콘솔도 파일이므로 다를건 없습니다.
스래드 없이 간단한 구조로 구현할수 있어서 시그널을 이용한 방법이 많이 쓰이는걸로 알고있습니다.
음 ..
아무런 입력이 없는 동안 주기적으로 짧은 시간동안 무언가를 체크할 필요가 있을 때도 select() 를 쓰기도 합니다.
key down 이벤트를 받아서 처리한다 하더라도, 결국은 엔터가 입력될때까지는 기다리게 될겁니다.
결국은 select() 로 fd 를 감시하다가, 데이터가 있으면 그 때 읽어들여도 비슷할 것 같아서 말씀드렸습니다.
음.. 그런데 메인이 바빠서 입력값을 처리하기 곤란한 정도라면..
그 바쁜일을 thread 에게 맡기고, 메인은 control 에 주력하는게 나을것 같습니다.
사실 이런 경우에는 select() 는 필요 없을 수도 있습니다.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
결론은 쓰레드군요. 감사합니다.
일단 메인이 바쁘다기 보다는 서버를 돌리는거라 클라이언트 접속을 기다려야 되서 accept에서 대기를 타고 있는 중이라서 루프가 멈춰있는 상태거든요;
결국 쓰레드 한개를 추가를 하긴 해야하는거군요.
음 ..
모든 fd 를 하나의 select 로 몰아서 감시하고...
listen socket, client socket, stdin 에서 각각의 이벤트가 있을 때마다..
자기 일을 하도록 하면 됩니다.
FD_SET 으로 다른 fd 들을 추가하시고..
FD_ISSET 으로 해당 fd 에 이벤트가 발생했는지 보세요.
listen socket 이라면 accept 호출..
client socket 이라면 read 호출..
stdin 이라면 fgets 로 읽어서 커맨드 처리..
select, epoll 등은 특히 소켓 처리할 때 많이 사용되는 유용한 함수입니다.
친해지면 아주 도움되는 녀석들입니다.
아래 샘플 코드에 stdin 의 fd 만 추가하면 비슷해지겠네요.
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/Network_Programing/Documents/select
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
의문점이 모두 풀렸습니다.
돼지목에 진주라고 함수를 봐도 용도를 이해를 못하고 있었네요.
감사합니다 ^^
등은 특히 소켓 처
isten socket,rolex uhren preisliste client socket, stdin 에서 각각의 이벤트가 있을 때마다..
자기 일을 하도록 하면 됩니다.
FD_SET 으로 다른 fd 들을 추가하시고..
FD_ISSET 으로 해당 fd 에 이벤트가 발생했는지 보세요.
listen socket 이라면 accept 호출..
client socket rolex uhren damen이라면 read 호출..
stdin 이라면 fgets 로 읽어서 커맨드 처리..
select, epollugg boots cardy 등은 특히 소켓 처리할 때 많이 사용되는 유용한 함수입니다.
친해지면 아주 도움되는 녀석들입니다.
대박!
낚였음.
댓글 달기