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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2011, 22:29   #1
thornish
 
Регистрация: 11.10.2011
Сообщений: 5
По умолчанию Работа с сигналом alarm

Собственно задание:
Реализация тайм-аута при помощи сигнала-"будильника" SIGALRM.

Напишите программу , которая ожидает ввода имени с клавиатуры, печатает "Привет, <имя>" и завершается. Если имя не было введено в течение пяти секунд, то программа печатает "Время истекло" и завершается.
ПРИМЕЧАНИЯ.
1. Задайте обработчик для сигнала SIGALRM с пустым телом функции-обработчика.
2. Перед вызовом функции read запустите будильник функцией alarm.
3. Если read завершилась с ошибкой, то следует проверить значение errno. Если errno равно
EINTR, то истек тайм-аут.

Поясните в отчете, почему возникает ошибка EINTR. Повлияет ли на работу программы ус-
тановка флага SA_RESTART в поле sa_flags структуры sigaction? Почему?
thornish вне форума Ответить с цитированием
Старый 11.10.2011, 22:31   #2
thornish
 
Регистрация: 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.
thornish вне форума Ответить с цитированием
Старый 11.10.2011, 22:32   #3
thornish
 
Регистрация: 11.10.2011
Сообщений: 5
По умолчанию

Буду очень благодарен, если поможете поправить код. Ну или покажете свой вариант с пояснением. Только главное, чтобы это работало в терминале linuxа, так как задание именно в нем нужно сдавать.
thornish вне форума Ответить с цитированием
Ответ


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



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