Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2009, 19:41   #1
bymer
Новичок
Джуниор
 
Регистрация: 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);
}
bymer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Консольная программа под 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