단일 스레드 C 응용 프로그램에 정의 된 종료 후크 처리기가 있습니다.CRITICAL 섹션을 완료하기 위해 C 응용 프로그램을 종료하는 올바른 방법?
int main(int argc, char * argv[]){
//Shutdown hook for CTRL-C
(void) signal(SIGINT, shutdownHook);
...
...
}
사용자가 종료 훅이 시작됩니다 CTRL-C 안타 그래서 ...
void shutdownHook(int sig){
rc = wmq_sender_stop(errorStr);
if (rc != 0){
printf("\n%s\n", errorStr);
}
while(transactionRunning == TRUE){
sleep(1);
printf("Transaction still running\n");
}
....
....
}
당신은 내가 (공유 lib에)는 "wmq_sender_stop"루틴을 호출 그 위에 볼 수 있습니다 본질적으로 변수를 FALSE로 설정하여 해당 공유 라이브러리의 루프를 종료합니다.
변수 "running"은 (아마도) 공유 라이브러리에서 실행되는 메인 루프를 멈출 것입니다.
while(running == TRUE){
...
...
}
오전 데 문제는 모두가 100 % 작동하는 내 리눅스 박스에 ...하지만 난 BIG 강력한 서버에 응용 프로그램을 설치할 때 그것은 "wmq_sender_stop"를 호출하고 변수 벌금을 설정하지만 보인다 응용 프로그램이 "while (running == TRUE)"변수를 종료 할 수 있도록 서버에서 너무 빠르게 실행되고 있습니다 ..... 또는 단순히 주 응용 프로그램으로 너무 빨리 돌아가고 "while (transactionRunning == TRUE
:) "루프 그냥 계속 ... 실행 는 본질적으로 BIG 서버에 내가 CRTL-C를 치면 다음 화면에 continuosly 출력 0아마도 여기에 스레드를 만들고 상호 통신해야하지만 매우 빠른 서버에서도 종료하기 전에 "공유 라이브러리의 루프"를 "중요한 코드/트랜잭션"을 우아하게 허용하는 더 쉬운 방법은 아닙니다. ? 그리고 그것은 왜 내 리눅스 노트북에서 작동합니까?
스레드를 사용해야하는 경우 가장 빠르고 가장 빠른 방법은 무엇입니까? 현재 CALLBACKS ....을 사용하고 있습니다 만, 최고의 IPC가 쓰레드에 대해 무엇인지 모르십니까? 도움을
덕분에, 많은 return
를 통해 신호 처리기를 떠나보다 왜 단지 wmq_sender_stop()
를 호출하지 린톤
리눅스 박스에서 'transactionRunning'을 FALSE로 설정하는 것은 무엇입니까? 단일 스레드 응용 프로그램 인 경우 변경하는 'sleep/printf'루프가 아닙니다 ... –
일반적으로 신호 처리기 (또는 I/O)에서 장기 실행 작업을 수행하는 것은 좋지 않습니다. 신호 처리기 대신 주 스레드에 "신호"를 보내고 거기에서 모든 작업을 수행하십시오. –
당신이 app이 단일 쓰레드라고 말했기 때문에, 공유 라이브러리는 app 루프와 SIGINT 핸들러에서 기다리는 루프를 종료 할 기회가 없다. interessting 사실은 비록 당신이 그것을해서는 안되지만 리눅스 박스에서 원하는대로 작동하는 것처럼 보입니다. 서버의 동작은 나에게 완벽하게 보인다. – alk