| #include "Child.h" |
| |
| |
| void setLevel(int log_level) |
| { |
| |
| time_t seconds = time(NULL); |
| tm* timeinfo = localtime(&seconds); |
| fstream file(FILE_NAME, ios::app); |
| switch (log_level) |
| { |
| case LOG_DEBUG_LEVEL: |
| { |
| file << asctime(timeinfo) << "some_debug_info" << endl; |
| file << asctime(timeinfo) << "Error: index out of range." << endl; |
| file << asctime(timeinfo) << "Error: could not find file." << endl; |
| file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl; |
| file.close(); |
| cout << "some_debug_info" << endl; |
| cout << "Error: index out of range." << endl; |
| cout << "Error: could not find file." << endl; |
| cout << "Fatal_error: processes must be closed." << endl; |
| break; |
| } |
| case LOG_ERROR_LEVEL: |
| { |
| file << asctime(timeinfo) << "Error: could not find file." << endl; |
| file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl; |
| file.close(); |
| cout << "Error: could not find file." << endl; |
| cout << "Fatal_error: processes must be closed." << endl; |
| break; |
| } |
| case LOG_FATAL_LEVEL: |
| { |
| file << asctime(timeinfo) << "Fatal_error: processes must be closed." << endl; |
| file.close(); |
| cout << "Fatal_error: processes must be closed." << endl; |
| break; |
| } |
| } |
| } |
| |
| #ifdef _MSC_VER |
| |
| #define UP_EVENT 'U' |
| #define DOWN_EVENT 'D' |
| #define EXIT_EVENT 'E' |
| #define ACCESS_EVENT "A" |
| |
| #else |
| |
| void handler(int p) |
| { |
| switch(p) |
| { |
| case SIGINT: |
| { |
| exit(0); |
| } |
| case SIGHUP: |
| { |
| setLevel(); |
| cout << "getppid() = " << getppid() << endl; |
| kill(getppid(), SIGHUP); |
| return; |
| } |
| case SIGUSR1: |
| { |
| if (log_level < 2) |
| { |
| log_level++; |
| } |
| return; |
| } |
| |
| case SIGUSR2: |
| { |
| cout << "Log level down" << endl; |
| if (log_level > 0) |
| { |
| log_level--; |
| } |
| return; |
| } |
| } |
| } |
| #endif |
| |
| int main(int argc, char * argv[]) |
| { |
| |
| #ifdef _MSC_VER |
| |
| HANDLE up_event; |
| HANDLE down_event; |
| HANDLE exit_event; |
| HANDLE access_event; |
| DWORD check; |
| char buff[3]; |
| buff[0] = argv[0][0]; |
| buff[2] = '\0'; |
| int log_level = 2; |
| |
| buff[1] = UP_EVENT; |
| if (!(up_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff))) |
| { |
| return 0; |
| } |
| |
| buff[1] = DOWN_EVENT; |
| if (!(down_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff))) |
| { |
| return 0; |
| } |
| |
| buff[1] = EXIT_EVENT; |
| if (!(exit_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, buff))) |
| { |
| return 0; |
| } |
| |
| if (!(access_event = OpenEventA(EVENT_ALL_ACCESS | EVENT_MODIFY_STATE, TRUE, ACCESS_EVENT))) |
| { |
| return 0; |
| } |
| |
| while (true) |
| { |
| check = WaitForSingleObject(up_event, NULL); |
| if (check == WAIT_OBJECT_0) |
| { |
| if (log_level < 2){ |
| log_level++; |
| } |
| } |
| |
| check = WaitForSingleObject(down_event, NULL); |
| if (check == WAIT_OBJECT_0) |
| { |
| if (log_level > 0){ |
| log_level--; |
| } |
| } |
| |
| check = WaitForSingleObject(exit_event, NULL); |
| if (check == WAIT_OBJECT_0) |
| { |
| return 0; |
| } |
| |
| check = WaitForSingleObject(access_event, INFINITY); |
| if (check == WAIT_OBJECT_0) |
| { |
| setLevel(log_level); |
| SetEvent(access_event); |
| } |
| Sleep(4000); |
| } |
| |
| #else |
| |
| struct sigaction act; |
| memset(&act, 0, sizeof(act)); |
| act.sa_handler = handler; |
| sigset_t set; |
| sigemptyset(&set); |
| sigaddset(&set, SIGUSR1); |
| sigaddset(&set, SIGUSR2); |
| sigaddset(&set, SIGINT); |
| sigaddset(&set, SIGHUP); |
| act.sa_mask = set; |
| sigaction(SIGUSR1, &act, NULL); |
| sigaction(SIGUSR2, &act, NULL); |
| sigaction(SIGINT, &act, NULL); |
| sigaction(SIGHUP, &act, NULL); |
| |
| #endif |
| |
| } |