• Реклама


Новый вопрос

Разработка и Написание программ, вопросы, идеи...

Новый вопрос

Сообщение Aragaer 21 апр 2004 22:51

Продолжение предыдущего.
Итак, мне требуется обработать вызов cal так, чтобф по заданному числу определить день недели.

Варианты:
- Вызвать cal, загнать его результат в программу (несколько способов), затем обработать (дико громоздко).
- Вызвать cal, передать его по конвейеру куда-либо, там обработать и пусть это кто-то выдаст ответ прямо на экран. Это гораздо лучше.

Но тут всплывает вторая проблема. В процессе всего этого дела я должен перехватывать SIGINT'ы и (самое ужасное) все их посчитать. И вот это действительно проблема. Если внутри своей пограммы я могу отлавливать все SIGINT'ы и делать с ними все, что мне заблагорассудится, то внутри system я до них не дотянусь. И тогда происходит следующее:
- Я ничего не делаю, пользователь жмет ctrl+C пока мой перл обрабатывает cal. Итог - перл спокойно закрывается, system завершается, ответа нет, sigint не посчитался.
- Я ставлю signal(SIGINT, SIG_IGN) (игнорирую). Пользователь жмет ctrl+C, ничего не происходит, но sigint не посчитался (подсчет ведется только внутри моего обработчика, а я его только что отключил).
- Я ставлю маску, запрещающую sigint. Пользователь жмет ctrl+C, ничего не происходит. Как только я снимаю маску, sigint проходит и я его отлавливаю и считаю.

Казалось бы - вот оно! Но препод начал придираться. И если пользователь (препод) успеет нажать ctrl+C более 1 раза, то после снятия маски мы зафиксируем только 1 сигнал. От меня требуется отловить и посчитать все.

Вариант "послать препода" исключаем.

Преподаватель ругался, что для обработки я использую медленный перл. Сегодня я написал обработку на awk, но показать ему не успел. Тем не менее меня напрягает мысль о том, что он опять может придраться. Лично я успеваю нажать ctrl+C как минимум один раз. Сделаю маску. Но и на два нажатия я наверно вполне способен. По его мнению, возможно как-то организовать обработку _всех_ приходящих прерываний. У меня идей по этому поводу нет. Может кто подскажет?
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Реклама

Сообщение Aragaer 22 апр 2004 18:07

Реакция замедленная.. Придется излагать собственный вариант решения.
Код: Выделить всё
if (fork!=0) {
    system(a);
    exit(0);
}

Процесс-родитель продолжает перехватывать все прерывания, до потомка (и спрятанного внутри него вызова awk или perl) прерывания не доходят.

Данный вариант одобрен преподавателем пару часов назад.
Open your eyes.
And Awaken.
Аватара пользователя
Aragaer
Склеротик.
Склеротик.
 
Сообщения: 113
Зарегистрирован: 28 сен 2003 19:32
Откуда: From Dreaming.

Сообщение SLAY`ee`K 10 май 2004 11:31

=)
Аватара пользователя
SLAY`ee`K
Модератор
Модератор
 
Сообщения: 125
Зарегистрирован: 07 окт 2003 20:57
Откуда: Виннипег (Манитоба, Канада)

Сообщение coder 19 май 2005 00:31

Код: Выделить всё
if (fork!=0) {
    system(a);
    exit(0);
}

Не возьму в толк, зачем создавать 3 процесса, если нужны только 2?

execl спасёт отца русской демократии!

Код: Выделить всё
   signal(SIGINT,hndl_sigint);
   if((pid=fork())==0)
   {
      signal(SIGINT,SIG_IGN);
      execl("prog","prog",0);
   }
   else
      wait(0);
coder
Сетевик
 
Сообщения: 10
Зарегистрирован: 13 дек 2004 14:05
Откуда: TS

Сообщение coder 19 май 2005 00:32

Ты часом не в МИЭМе учишься?
coder
Сетевик
 
Сообщения: 10
Зарегистрирован: 13 дек 2004 14:05
Откуда: TS

Сообщение oблачко 19 май 2005 08:15

хехе.. опомнился спустя год.. нетут ту уже никого
oблачко
Модератор
Модератор
 
Сообщения: 682
Зарегистрирован: 22 авг 2003 23:56
Откуда: Москва

Сообщение coder 19 май 2005 11:14

Ха! А год-то 2004...
coder
Сетевик
 
Сообщения: 10
Зарегистрирован: 13 дек 2004 14:05
Откуда: TS


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


  • Реклама
cron