теперь сделал нормально. если кому будет нужно:
| Код | #include <windows.h> #include <TCHAR.h> #include <time.h> #include <stdio.h> #include <conio.h>
int _tmain( int argc, TCHAR *argv[] ) { int temp; // переменная для получения кодов ошибок HANDLE mutex; // дескриптор мьютекса STARTUPINFO si; // окружение для дочернего процесса PROCESS_INFORMATION pi; // описание процесса дочернего процесса ZeroMemory(&si, sizeof(si)); // очистка структур ZeroMemory(&pi, sizeof(pi)); si.cb = sizeof(si); TCHAR picl[100]; ZeroMemory(&picl, 100); HANDLE hInput, hOutput;
mutex = CreateMutex(NULL, FALSE, L"8e07e18e-11e8-4e48-9c08-cc91d05f6ad8"); // создание именного объекта мьютекса temp = GetLastError(); if(temp == ERROR_ALREADY_EXISTS || temp == ERROR_ACCESS_DENIED) // цикл работы дочернего процесса { char timestr[10]; COORD ch; ch.X=0; ch.Y=0; do { temp = WaitForSingleObject(mutex, INFINITE); // ожидание и получение доступа к мьютексу switch(temp) { case WAIT_OBJECT_0: // доступ получен { hInput = GetStdHandle(STD_INPUT_HANDLE); hOutput = GetStdHandle(STD_OUTPUT_HANDLE); _strtime_s( timestr, 9 ); SetConsoleCursorPosition(hOutput,ch); printf("child process: %s", timestr); Sleep(500); ReleaseMutex(mutex); break; } } }while(!_kbhit()); CloseHandle(mutex); return 0; } else // родительский цикл { temp = CreateProcess(argv[0], picl, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi); // создание дочернего процесса if(temp != 0) { char timestr[10]; COORD pr; pr.X=40; pr.Y=0; do { temp = WaitForSingleObject(mutex, INFINITE); switch (temp) { case WAIT_OBJECT_0: { hInput = GetStdHandle(STD_INPUT_HANDLE); hOutput = GetStdHandle(STD_OUTPUT_HANDLE); _strtime_s( timestr, 9 ); SetConsoleCursorPosition(hOutput, pr); printf("parent process: %s", timestr); ReleaseMutex(mutex); Sleep(500); break; } } }while(!_kbhit()); } else return 0; WaitForSingleObject(pi.hProcess, INFINITE); // ожидание завершения дочернего процесса CloseHandle(pi.hProcess); // закрытие дескрипторов объектов ядра CloseHandle(mutex); } return 0; }
|
| Код | #include <time.h> #include <sys/types.h> #include <sys/ioctl.h> #include <stdio.h> #include <curses.h> #include <unistd.h> #include <signal.h>
void sig_winch(int signo) // обработка сигнала изменения окна { struct winsize size; // структура "размер окна" ioctl(fileno(stdout), TIOCGWINSZ, (char *) &size); // получение данных о новых размерах окна resizeterm(size.ws_row, size.ws_col); // обновление содержимого окна в соответствии с новыми размерами }
void win_draw(WINDOW * pwnd, int row, int col) // вывод в опр. окно в опр. координаты { WINDOW *wnd; // дескриптор окна wnd = derwin(pwnd, 5, 30, row, col); // создание под-окна wrefresh(wnd); // обновление под-окна
time_t _time = time(NULL); // получение времени char * _ctime = ctime(&_time); // формирование строки mvwaddstr(wnd, 0, 0, _ctime); // вывод строки в под-окно delwin(wnd); sleep(0.4); }
int main() { WINDOW * wnd; // дескриптор окна терминала bool temp; wnd = initscr(); // инициализация библиотеки signal(SIGWINCH, sig_winch); // установка обработчика сигнала cbreak(); // ввод с клавиатуры моментальный, не дожидаясь ENTER attron(A_UNDERLINE); // установка параметров текста, подчеркнутый curs_set(0); // "выключение" курсора clear(); // очистка экрана refresh(); // вывод изменений pid_t _pid = fork(); // порождение дочернего процесса if (_pid != -1) { while(1) { if (_pid) // если родительский { if(!temp) { sleep(1); temp=true; } win_draw(wnd, 0, 45); sleep(0.1); } else // дочерний { win_draw(wnd, 0, 0); } } if (_pid) { kill(_pid, SIGKILL); // убийство дочернего } } else { printf("Occured fork()-error"); } endwin(); // очистка параметров библиотеки system("clear"); // чистка экрана системными ф-ями return 0; }
|
|