我正在开发一个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秒启动一次函数。其中一名儿童将由该部门处理。因此,我首先使用简单的信号()方法创建了一个告警()处理程序。之后,我意识到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时,整个加载过程将变得疯狂。请帮助我使用什么来阻止读取和等待用户交互,而不是getchar(),因为我已经尝试了一切。或者如果有人能帮我,我怎么能解决这个问题,我会感激的。当然,如果您有进一步的问题或关切,请告诉我,我将尽快更新我的问题。提前感谢
发布于 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节用于历史上的库调用。
https://stackoverflow.com/questions/27760410
复制相似问题