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