|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.10.2011, 22:29 | #1 |
Регистрация: 11.10.2011
Сообщений: 5
|
Работа с сигналом alarm
Собственно задание:
Реализация тайм-аута при помощи сигнала-"будильника" SIGALRM. Напишите программу , которая ожидает ввода имени с клавиатуры, печатает "Привет, <имя>" и завершается. Если имя не было введено в течение пяти секунд, то программа печатает "Время истекло" и завершается. ПРИМЕЧАНИЯ. 1. Задайте обработчик для сигнала SIGALRM с пустым телом функции-обработчика. 2. Перед вызовом функции read запустите будильник функцией alarm. 3. Если read завершилась с ошибкой, то следует проверить значение errno. Если errno равно EINTR, то истек тайм-аут. Поясните в отчете, почему возникает ошибка EINTR. Повлияет ли на работу программы ус- тановка флага SA_RESTART в поле sa_flags структуры sigaction? Почему? |
11.10.2011, 22:31 | #2 |
Регистрация: 11.10.2011
Сообщений: 5
|
Помогите поправить программу, я вроде написал, но она как то неправильно работает:
(запускаю через терминал линукса, т.к. нужно именно чтобы там работало) #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <string.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> extern int errno; void hand(int snumber) {} int main() { struct sigaction sigact; memset(&sigact,0,sizeof(sigact)); sigact.sa_handler=hand; sigaction(SIGALRM,&sigact,NULL); char buf[15]; int n; alarm(5); n=read(0,buf,15); alarm(0); if((n<0)&&(errno==EINTR)) {fprintf(2,"vremya isteklo\n\n"); exit(1);} if(n<0) {fprintf(2,"read error\n\n"); exit(1);} printf("privet, "); write(1,buf,15); printf("\n\n"); return 0; } теоретически он запускает таймер и если по истечении 5 секунд ничего не введено, то должен уйти в обработчик ошибок и вывести "vremya isteklo", но в этом случае он мне пишет "Ошибка сегментирования". Скорее всего у меня обработчик сигнала неправильно написан, либо обработка ошибки errno. Помогите исправить пожалуйста. А в том случае, если ввести что то с клавиатуры до того как время кончится, то он в каком то неправильном порядке команды выполняет. Например для случая если введено inferno, то он выведет: inferno ???privet, То есть сначала команду write и только потом printf, хотя первым стоит printf и лишь потом write. и кроме того он перед "privet" выводит какие то непонятные символы( обозначил вопросами). Почему он так работает и как поправить? Последний раз редактировалось thornish; 11.10.2011 в 22:34. |
11.10.2011, 22:32 | #3 |
Регистрация: 11.10.2011
Сообщений: 5
|
Буду очень благодарен, если поможете поправить код. Ну или покажете свой вариант с пояснением. Только главное, чтобы это работало в терминале linuxа, так как задание именно в нем нужно сдавать.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помощь с BASS, сигналом и выводом графики | Манжосов Денис :) | Мультимедиа в Delphi | 7 | 12.01.2011 15:25 |
Задача. Работа с псевдослучайными последовательностями (ПСП). Работа с цветом. | 0101 | Помощь студентам | 3 | 17.12.2009 23:57 |
Помогите с цифровым сигналом, пожалуйста. | zzz678 | Помощь студентам | 3 | 12.11.2009 21:18 |
Работа с webbrowser - Фреймы, работа с конкретным феймом в фрейме | NewDelphi | Фриланс | 2 | 08.10.2009 11:00 |