Я работаю над многопроцессорным приложением терминала C. Приложение основано на меню, поэтому пользователь должен выбирать из возможностей для выполнения действия. Меню заблокировано функцией getchar(). Позвольте мне показать часть кода:
do
{
do
{
printf("\n\n---------------\nMenu\n\n");
printf("1. Option 1\n");
printf("2. Option 2\n");
printf("3. Option 3\n");
printf("4. Exit");
printf("\n\n---------------\n");
scanf("%d", &end);
int c = getchar();
if(end < 1 || end > 4)
{
printf("Try it again!!!\n\n");
}
}
while(end < 1 || end > 4);
}
while(end != 4);
Поэтому пользователю нужно выбрать один из вариантов. Но проблема в том, что второй вариант должен запускать функцию каждые 5 секунд в фоновом режиме. Один из дочерних элементов будет обрабатываться функцией. Итак, сначала я создал обработчик alarm() с помощью простого метода signal(). После этого я понял, что процесс ввода-вывода getchar() блокируется полученными сигналами. Я попытался создать новый дочерний элемент, который должен обрабатывать процессы стандартного ввода и отправлять результат в канал для родителя, но это тоже не сработало. Позвольте мне поделиться текущей частью обработки сигналов для лучшего понимания:
// Alarm handling
void CatchAlarm(int sig)
{
if(someCounts > 0)
{
DoSomething();
alarm(5);
}
}
Также привязка будильника:
struct sigaction alarmAction;
alarmAction.sa_handler = CatchAlarm;
sigemptyset(&alarmAction.sa_mask);
alarmAction.sa_flags = SA_RESTART;
sigaction(SIGALRM, &alarmAction, NULL);
Моя проблема в том, что я не могу отправить родительский процесс в спящий режим, потому что пользователь должен иметь возможность выполнять другие действия во время ожидания тревоги. Когда я получаю SIGALRM, полный процесс чтения стандартного ввода сходит с ума. Пожалуйста, помогите мне, что я могу использовать, чтобы заблокировать чтение и ожидание взаимодействия с пользователем вместо getchar(), потому что я уже все перепробовал. Или, если кто-то может помочь мне, как я могу решить проблему, я могу это оценить. Конечно, если у вас есть дополнительные вопросы или проблемы, пожалуйста, дайте мне знать, и я обновлю свой вопрос как можно скорее. заранее спасибо
select
иpoll
, - person Jasen   schedule 04.01.2015