리눅스 프로그래밍에서 ctrl+c 시..
글쓴이: luftpalen / 작성시간: 월, 2005/07/25 - 9:55오후
소켓프로그래밍을 하면서 디버깅시에 ctrl+ c 로써 프로그램을 종료해야할 일이 번번히 발생하는데, 소켓이 제대로 안닫혀서 다음 디버깅시에 bind error 가 뜨곤합니다. 이는 시간이 해결해주지만, ctrl+c 시에 close(sock_fd) 와 기타 메모리관리를 실행시키면서 종료할 수 있는 방법이 있는지요.. ?
원래 검색의 생활화가 신조이지만, 시그날이라고 하는것같은데 정확히 몰라서 검색을 못해 이렇게 올립니다. (알아야 검색도.. :( )
Forums:
시그널을 잡아주세요.. SIG_INT 터미널/콘솔에서 ctrl+c시
시그널을 잡아주세요.. SIG_INT 터미널/콘솔에서 ctrl+c시
SIG_INT가 떨어지는 것으로 알고 있습니다..
자세한 것은 man sigaction
Re: 리눅스 프로그래밍에서 ctrl+c 시..
소켓을 제대로 닫지 않고 프로세스를 종료 한 뒤 다시 수행했을 때 해당 포트에 대해 bind 가 안되는 문제는
를 bind 직전에 수행시켜주는 것으로 해결할 수 있습니다.
원인은, (아마도 TCP)소켓을 사용하는 프로그램이 비정상적으로 종료되었을 경우, 반대쪽 프로세스(혹은 원격 호스트)가 보내는 커넥션 종료 신호를 기다리기 위해 소켓을 일정시간동안 더 열어두기 때문입니다.
그럴 염려가 없다면 위의 코드를 bind 직전에 넣어서 문제를 해결할 수 있습니다. 자세한 내용은 위의 코드에 대해 맨페이지님께 물어보십시오 :)
반대쪽의 어떤 능동적 작용을 기다리기 보다는, 자신이 종료이전에 보낸 패
반대쪽의 어떤 능동적 작용을 기다리기 보다는, 자신이 종료이전에 보낸 패킷에 대해 수동적인 책임을 지기 위함입니다.(그 패킷이 망에서 소멸될 시간을 대기하는 것이지요. 그 패킷이 라우터 또는 peer에서 소멸/처리된다면, 이때 이에 대한 응답패킷이 오게되겠지요. 이때, 이를 수신할 프로그램은 이미 종료되었으나, 커널이 그 책임을 지는것입니다. 뒷감당한다고나 할까?)
책임을 지는것이 정당한 방법이며, 임의로 linger옵션을 주어 그 대기시간을 강제 조절할 수 있습니다.( setsockopt(), SOL_SOCKET, SO_LIGER참조)
특정한 경우를-이를테면, 나는 중요한 서버고, TIME_WAIT 할 자원조차 아껴야 한다면- 제외하고는 SO_REUSEADDR이 보다 나은 방법으로 보입니다.
댓글 달기