我正在使用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秒启动一个功能。其中一个孩子将由该功能处理。所以我先用简单的signal()方法创建了一个alarm()处理程序。之后,我意识到getchar()I / O进程被接收到的信号阻塞了。我试图创建一个应该处理stdin进程的新子进程,并将结果发回给父进程的管道,但这也没有用。 让我分享当前的信号处理部分,以便更好地理解:
// 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时,完整的stdin读取过程将变得疯狂。请帮助我,我可以使用什么来阻止阅读和等待用户交互,而不是getchar(),因为我已经尝试了一切。或者,如果有人可以帮助我,我怎么能解决这个问题,我可以理解。 当然,如果您有其他问题或疑虑,请告诉我们,我会尽快更新我的问题。 提前致谢
答案 0 :(得分:1)
只需在alarm(5);
之前调用getchar();
,因此建议内核发送SIGALRM
信号以中断 getchar(3)。然后,您不必将任何代码放入信号处理程序中(但是确实需要信号处理程序或程序将被终止,请参阅 alarm(2)和 kill(2)以获得解释)你必须在getchar调用之后卸载它,或者在5秒之后无论如何都要调用信号处理程序,但是这样做了留给读者练习。
作为unix的标准配置,像 getchar(3)这样的引用意味着getchar例程的手册页,它位于在线unix参考手册的第3部分。第2节专门用于系统调用,第3节专门用于库调用。