2014-12-22 63 views
0

我必须弄清楚如何编写一个循环但无法使用CTRL-C退出5秒的程序,但是5秒后我可以使用CTRL-C结束程序。我一直在阅读系统调用,什么不是,但我不知道从哪里开始。如果有人能指引我朝着正确的方向,这里有确切的说明。谢谢。使用系统调用的问题

编写一个C程序,该程序使用系统调用创建一个循环,并且无法用控件C杀死5秒钟。当它开始时它会打印出“我已经开始循环,不能用^ C杀死。 。 。“然后每秒打印一条消息,说”仍然循环。 。 。“五秒钟后,允许循环被控制C杀死,并显示消息”我仍在循环,但我可以用^ C杀死......“每秒显示一次,直到用户杀死它为止。

+1

您可以使用[sigaction](http://man7.org/linux/man-pages/man2/sigaction.2.html)来捕获Ctrl-C(SIGINT)。可能的[示例代码](http://stackoverflow.com/questions/4217037/catch-ctrl-c-in-c)上的sigaction。 – SSC

+1

一个有趣的方法是将中断字符设置为control-T前5秒,然后将其设置回控制C. –

回答

1

您想查看signal(2)接口。当在UNIX/Linux环境中发生某些与进程相关的事件时,操作系统会向进程发送一个信号(实质上是一个软件中断)。您可以使用signal函数“捕捉”信号来设置回调函数,该函数在发生给定信号时得到通知。对于Ctrl-C,您希望查看SIGINT,但您可以使用相同的界面处理其他信号。至于暂停,这很容易 - 只需在循环中使用sleep()即可。

+0

我喜欢你让提问者学习如何自助服务的方法,但值得一提的是'sleep()'将阻止该线程上发生的任何工作。 –

+0

谢谢,我在最初的答案中加入了“循环”。 OP需要每秒打印一条消息,因此设置信号处理程序后,他们可以执行此操作(当然,只有伪代码): 'for(秒数)do {sleep 1 second;打印信息}' – frasnian

+0

使用['sigaction()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigaction.html)比使用 ['signal()']更好(http://pubs.opengroup.org/onlinepubs/9699919799/functions/signal.html),但使用'sigaction()'稍微难一些。 'signal()'有很多问题可以通过'sigaction()'来避免。 –

1

你可以使用这个。

void handler(int signo) 
{ 
    signal(SIGINT,SIG_DFL); 
} 

main() 
{ 
    signal(SIGINT,SIG_IGN); 
    signal(SIGALRM,handler); 
    // your code. 
    alarm(5);// for 5 seconds. 
    while(1) 
    { sleep(1); 
    printf("your message\n"); 
    }  
} 

首先忽略使用信号的SIGINT。和sigalrm的处理程序。所以前5秒ctrl+c将无法​​正常工作。在ctrl + c之后找到sigalrm时就可以工作。所以根据你的问题在特定时间段ctrl+c将被停止。

+0

你确定要发布完整的程序来为他们做这个人的作业吗?至少这个OP只是要求指向正确的方向(与许多其他有家庭作业相关问题的人实际上*要求完整的程序不同)。我认为OP应该有机会为他/她自己学习。恕我直言。 – frasnian

+0

我不会假设你要求你删除你的答案 - 这完全取决于你。我只是觉得提问者实际上要求他们做功课而不是要求他们为他们完成而很少。这让我想给他们一个“好工作!”电子卡片什么的。使用'alarm()'是一种与我的不同的方法,它提供了'signal'的其他用途的示例,所以OP可能会从作业中学到更多东西。您可能需要为他们分配额外的家庭作业:“使用这种方法,您还会如何每秒钟打印一次?” – frasnian