Страница 1 из 1

Новый вопрос

СообщениеДобавлено: 21 апр 2004 22:51
Aragaer
Продолжение предыдущего.
Итак, мне требуется обработать вызов 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 как минимум один раз. Сделаю маску. Но и на два нажатия я наверно вполне способен. По его мнению, возможно как-то организовать обработку _всех_ приходящих прерываний. У меня идей по этому поводу нет. Может кто подскажет?

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

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

Данный вариант одобрен преподавателем пару часов назад.

СообщениеДобавлено: 10 май 2004 11:31
SLAY`ee`K
=)

СообщениеДобавлено: 19 май 2005 00:31
coder
Код: Выделить всё
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);

СообщениеДобавлено: 19 май 2005 00:32
coder
Ты часом не в МИЭМе учишься?

СообщениеДобавлено: 19 май 2005 08:15
oблачко
хехе.. опомнился спустя год.. нетут ту уже никого

СообщениеДобавлено: 19 май 2005 11:14
coder
Ха! А год-то 2004...