C - SIGALRM阻止getchar()

时间:2015-01-03 22:53:28

标签: c signals alarm getchar

我正在使用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(),因为我已经尝试了一切。或者,如果有人可以帮助我,我怎么能解决这个问题,我可以理解。 当然,如果您有其他问题或疑虑,请告诉我们,我会尽快更新我的问题。 提前致谢

1 个答案:

答案 0 :(得分:1)

只需在alarm(5);之前调用getchar();,因此建议内核发送SIGALRM信号以中断 getchar(3)。然后,您不必将任何代码放入信号处理程序中(但是确实需要信号处理程序或程序将被终止,请参阅 alarm(2) kill(2)以获得解释)你必须在getchar调用之后卸载它,或者在5秒之后无论如何都要调用信号处理程序,但是这样做了留给读者练习。

关于符号的注释

作为unix的标准配置,像 getchar(3)这样的引用意味着getchar例程的手册页,它位于在线unix参考手册的第3部分。第2节专门用于系统调用,第3节专门用于库调用。