#include <stdio.h>
#include <time.h>
#include <setjmp.h>
#include <Windows.h>
static jmp_buf g_JmpBuf;
static int g_ThreadRun = 0;
static HANDLE g_hThread = INVALID_HANDLE_VALUE;
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
puts("user interrupt!");
switch (dwCtrlType)
{
case CTRL_C_EVENT:
//longjmp(g_JmpBuf,1);
break;
case CTRL_BREAK_EVENT:
//longjmp(g_JmpBuf,1);
break;
case CTRL_CLOSE_EVENT:
longjmp(g_JmpBuf,1);
break;
case CTRL_LOGOFF_EVENT:
break;
case CTRL_SHUTDOWN_EVENT:
break;
}
return TRUE;
}
DWORD WINAPI pthread_start_routine(LPVOID lpThreadParameter)
{
WORD activeTime = *((WORD*)lpThreadParameter);
time_t beginTime = time(NULL);
time_t current = 0;
while( g_ThreadRun )
{
if( (current = time(NULL) - beginTime) < activeTime )
{
printf("%lu \r",activeTime - current);
fflush(stdout);
Sleep(500);
}
else
{
break;
}
}
puts("!!!");
return 0;
}
int main(int argc, char * argv[])
{
WORD activeTime = 0;
SetConsoleCtrlHandler(HandlerRoutine,TRUE);
if( 1 == setjmp(g_JmpBuf) )
{
g_ThreadRun = 0;
WaitForSingleObject(g_hThread,INFINITE);
CloseHandle(g_hThread);
return EXIT_FAILURE;
}
if(argc > 1)
{
activeTime = atoi(argv[1]);
}
else
{
puts("Input shutdown time(sec):");
scanf("%lu",&activeTime);
}
printf("SET(%lu) second\n",activeTime);
if(activeTime > 0)
{
g_hThread = CreateThread(NULL,0,pthread_start_routine,(LPVOID)&activeTime,0,NULL);
if(g_hThread == INVALID_HANDLE_VALUE)
{
puts("start thread fail");
return EXIT_FAILURE;
}
g_ThreadRun = 1;
}
if(g_hThread != INVALID_HANDLE_VALUE)
{
WaitForSingleObject(g_hThread,INFINITE);
CloseHandle(g_hThread);
}
puts("SHUT_DOWN!!!");
//ExitWindowsEx(EWX_SHUTDOWN,0x00);
return EXIT_SUCCESS;
}