首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >块getchar()

块getchar()
EN

Stack Overflow用户
提问于 2015-01-03 22:53:27
回答 1查看 1.1K关注 0票数 1

我正在开发一个C终端多进程应用程序。应用程序是基于菜单的,因此用户必须从执行操作的可能性中进行选择。菜单被getchar()阻塞。让我向大家展示:

代码语言:javascript
复制
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秒启动一次函数。其中一名儿童将由该部门处理。因此,我首先使用简单的信号()方法创建了一个告警()处理程序。之后,我意识到getchar() I/O进程被接收到的信号阻塞。我尝试创建一个新的子程序,它应该处理stdin进程,并在一个管道中将结果发送给父进程,但这也不起作用。让我分享一下目前的信号处理部分,以便更好地理解:

代码语言:javascript
复制
// Alarm handling
void CatchAlarm(int sig)
{
    if(someCounts > 0)
    {
        DoSomething();
        alarm(5);
    }
}

此外,警报绑定:

代码语言:javascript
复制
struct sigaction alarmAction;
alarmAction.sa_handler = CatchAlarm;
sigemptyset(&alarmAction.sa_mask);
alarmAction.sa_flags = SA_RESTART;
sigaction(SIGALRM, &alarmAction, NULL);

我的问题是,我无法将父进程发送到睡眠中,因为用户必须能够在警报挂起期间执行其他活动。当我得到SIGALRM时,整个加载过程将变得疯狂。请帮助我使用什么来阻止读取和等待用户交互,而不是getchar(),因为我已经尝试了一切。或者如果有人能帮我,我怎么能解决这个问题,我会感激的。当然,如果您有进一步的问题或关切,请告诉我,我将尽快更新我的问题。提前感谢

EN

回答 1

Stack Overflow用户

发布于 2015-01-07 13:04:04

只需将一个alarm(5);调用放在getchar();之前,因此建议内核发送一个SIGALRM信号来中断getchar(3)。然后,您不需要在信号处理程序中放入任何代码(但是您确实需要--信号处理程序,否则程序将被杀死,请参见警报(2)kill(2) ),您必须在getchar调用之后卸载它,否则信号处理程序将在5秒后被调用,但这是留给读者的练习。

注记法

长期以来,作为unix的标准,像 getchar (3)这样的引用是指位于在线unix参考手册第3节中的getchar例程的手册页。第2节专门用于系统调用,第3节用于历史上的库调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27760410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档