|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.09.2009, 19:41 | #1 |
Новичок
Джуниор
Регистрация: 29.09.2009
Сообщений: 1
|
Лаба под Linux
Вот написал часть лабы, ее суть в том, что нужно в терминале сделать три окна: в одном - состояние процесса, во втором - команду вводить, в третьем - показывать что процесс работает(я сделал часы как индикатор работы). Команды - создать процесс, остановить(время должно тоже останавливаться), возобновить, убить процесс. Нужно тут прикрутить синхронизацию с помощью сигналов - не могу понять как это сделать. Подскажи плиз. Заранее благодарен.
#include <termios.h> #include <sys/ioctl.h> #include <signal.h> #include <stdlib.h> #include <curses.h> #include <sys/time.h> #include <stdio.h> #include <unistd.h> WINDOW * wnd; WINDOW * wnd2; WINDOW * wnd3; WINDOW * subwnd; char str [256]; int ret; int n=0; int x,y; time_t tp; char * s; char ** time_mas; bool arr_proc_is_pause[10]; pid_t pids[10]; char *st; int mygetch() { struct termios oldt, newt; int ch; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); ch=getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); return ch; } void sig_pause(char key) { int k; k = (int) key - 48; if(!(arr_proc_is_pause[k])) { arr_proc_is_pause[k] = true; tp = time(NULL); st=""; } else { arr_proc_is_pause[k] = false; tp = time(NULL); st = ctime(&tp); } time_mas[k]=st; wmove(wnd, 6, 2); int i; for(i = 0; i < 9; i++) { wmove(wnd, i+6, 2); wprintf(wnd, "%d", arr_proc_is_pause[i]); } } void alarm_handler() { int i; for ( i = 1; i < n + 1; i++) { wmove(wnd, i, 2); if (!arr_proc_is_pause[i]) { tp = time(NULL); s = ctime(&tp); wprintw(wnd, "%s", s); } else { wprintw(wnd, "%s", time_mas[i]); } } for ( i = 1; i < n + 1; i++) { wmove(wnd2, i, 3); wprintw(wnd2,"Process %d - work", i); printf("Process %d - work", i); } wrefresh(wnd); wrefresh(wnd2); } void sig_han() { ret = fork(); if(ret == -1) { wprintf(subwnd, "ERROR!\n"); wrefresh(subwnd); } else if(ret == 0) { int i; pids[n] = getpid(); } n++; wrefresh(wnd2); } int main(int argc, char ** argv) { struct itimerval delay; int ret; int key; int j; pid_t pi; time_mas = calloc(9,sizeof(char*)); for(j=0; j<10; j++) { arr_proc_is_pause[j]= false; } signal (SIGALRM, alarm_handler); delay.it_value.tv_sec = 1; delay.it_value.tv_usec = 0; delay.it_interval.tv_sec = 1; delay.it_interval.tv_usec = 0; ret = setitimer (ITIMER_REAL, &delay, NULL); tp = time(NULL); initscr(); signal(SIGWINCH, sig_winch); cbreak(); curs_set(TRUE); refresh(); wnd = newwin(20, 50, 0, 0); wnd2 = newwin(20, 30, 0, 50); wnd3 = newwin(3, 80, 20, 0); box(wnd, '|', '-'); box(wnd2, '|', '-'); box(wnd3, '|', '-'); leaveok(wnd,TRUE); leaveok(wnd2,TRUE); leaveok(wnd3,TRUE); wrefresh(wnd); wrefresh(wnd2); wrefresh(wnd3); for(; { key = mygetch(); switch(key) { case 'c': sig_han(); break; case '0': ; case '1': ; case '2': ; case '3': ; case '4': ; case '5': ; case '6': ; case '7': ; case '8': ; case '9': sig_pause(key);break; } pause(); } delwin(subwnd); delwin(wnd); move(55,55); refresh(); getch(); endwin(); exit(EXIT_SUCCESS); } |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Консольная программа под Linux | amdbodia | Общие вопросы C/C++ | 8 | 14.06.2009 20:23 |
нужен WebBrouser но под LINUX | OOO_leg | Компоненты Delphi | 3 | 02.11.2007 09:29 |
Эмулятор Win под Linux | Asain-Asa | Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) | 1 | 10.11.2006 07:21 |