超时功能
- 2024-10-28 08:37:00
- admin 原创
- 44
问题描述:
我想编写一个代码,要求输入用户名,但时间限制为 15 秒。如果用户超过限制且未能输入姓名(或任何字符串),则代码将终止并显示“超时”消息,否则应保存姓名并显示“感谢”消息。我试过这样做,但这是错误的并且不起作用。请给我一个解决方案。谢谢。
#include <stdio.h>
#include <time.h>
int timeout ( int seconds )
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
return 1;
}
int main ()
{
char name[20];
printf("Enter Username: (in 15 seconds)
");
printf("Time start now!!!
");
scanf("%s",name);
if( timeout(5) == 1 ){
printf("Time Out
");
return 0;
}
printf("Thnaks
");
return 0;
}
解决方案 1:
也许这个虚拟程序可能会帮助你:
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#define WAIT 3
int main ()
{
char name[20] = {0}; // in case of single character input
fd_set input_set;
struct timeval timeout;
int ready_for_reading = 0;
int read_bytes = 0;
/* Empty the FD Set */
FD_ZERO(&input_set );
/* Listen to the input descriptor */
FD_SET(STDIN_FILENO, &input_set);
/* Waiting for some seconds */
timeout.tv_sec = WAIT; // WAIT seconds
timeout.tv_usec = 0; // 0 milliseconds
/* Invitation for the user to write something */
printf("Enter Username: (in %d seconds)
", WAIT);
printf("Time start now!!!
");
/* Listening for input stream for any activity */
ready_for_reading = select(1, &input_set, NULL, NULL, &timeout);
/* Here, first parameter is number of FDs in the set,
* second is our FD set for reading,
* third is the FD set in which any write activity needs to updated,
* which is not required in this case.
* Fourth is timeout
*/
if (ready_for_reading == -1) {
/* Some error has occured in input */
printf("Unable to read your input
");
return -1;
}
if (ready_for_reading) {
read_bytes = read(0, name, 19);
if(name[read_bytes-1]=='
'){
--read_bytes;
name[read_bytes]=' ';
}
if(read_bytes==0){
printf("You just hit enter
");
} else {
printf("Read, %d bytes from input : %s
", read_bytes, name);
}
} else {
printf(" %d Seconds are over - no data input
", WAIT);
}
return 0;
}
**更新:
这是现在经过测试的代码。**
另外,我从 man 中得到了一些提示select
。本手册已包含一个代码片段,用于从终端读取数据,并在没有活动的情况下 5 秒内超时。
如果代码写得不够好,请简单解释一下:
我们将输入流(
fd = 1
)添加到FD集合中。我们发起
select
呼叫来监听为任何活动创建的这个 FD 集。如果在此
timeout
期间发生任何活动,则会通过read
呼叫读取。如果没有活动,则会发生超时。
希望这有帮助。
解决方案 2:
scanf()
并不是在有限时间范围内获取输入的最佳功能。
select()
相反,我会围绕系统调用(用于管理超时)和(用于获取输入)构建一个特定的输入函数read()
。
解决方案 3:
您必须考虑的一件事是,您的程序中只有一个执行线程。因此,只有当函数终止timeout
时才会调用该函数。这不是您想要的。scanf
完成这项任务的一种方法是使用select
函数。它会等待一段可能有限的时间(您的超时时间),以等待某些文件描述符上的输入可用(stdin
对您而言)。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD