如何:每隔一秒调用一个方法来实现 getchar() 或者如果它为空则继续
Posted
技术标签:
【中文标题】如何:每隔一秒调用一个方法来实现 getchar() 或者如果它为空则继续【英文标题】:How to: call a method every second impleting getchar() or if it's empty then continue 【发布时间】:2020-06-13 16:22:11 【问题描述】:所以我正在尝试做这样的事情:我有一个函数调用另一个函数,我正在从给定文件中逐行读取文本,我希望它执行它读取的内容(工作 atm),但是它应该每秒只执行一次,以便用户有时间在标准输入中写入例如 S,意思是 STOP(或类似的东西),否则如果用户没有输入任何内容,那么程序应该继续迭代文件。我该怎么做?
我一直用来尝试这个的是信号和警报(),测试出这样的东西:
#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<string.h>
volatile int breakflag = 2;
void handle(int sig)
if( getchar()=='a' )
printf("it read something from input\n");
--breakflag;
else
printf("it didn't read anything from input\n");
--breakflag;
alarm(2);
int main()
/*let's say this is part of the method that i call each iteration until I've read EOF.
now is the part that i should execute whatever i get into the stdin,
or if it's empty it should continue to next iteration...
*/
signal(SIGALRM, handle);
alarm(1);
while(breakflag)
sleep(1);
printf("done\n");
return 0;
抱歉,描述太长了。但是我很难尝试得到任何可行的方法。 我找到了一些答案,帮助我解决了这个问题,但我似乎无法弄清楚我需要它的方式......
【问题讨论】:
选择超时怎么样? 你能给我一个简单的例子,我将如何在这样的程序中实现它?不太确定。 我做了,看我的回答 您真的不能在信号处理程序中安全地执行这些操作。在这种情况下,getchar()
可以无限期地阻塞等待输入。而且您不能安全地从信号处理程序中进行大多数函数调用。在严格符合 C 代码中,you pretty much can't safely make any function calls:“因此,信号处理程序通常不能调用标准库函数。”大多数实现确实提供了一些在信号处理程序中可以安全调用的函数。 Linux 有man7.org/linux/man-pages/man7/signal-safety.7.html
谢谢,以后会记住的。
【参考方案1】:
您可以使用 select
超时 1 秒,例如:
#include <stdio.h>
#include <sys/select.h>
int main()
struct timeval tv;
fd_set fd;
int i;
FD_ZERO(&fd);
for (i = 0; i != 10; ++i)
FD_SET(0, &fd);
tv.tv_sec = 1;
tv.tv_usec = 0;
if (select(0 + 1, &fd, NULL, NULL, &tv) == -1)
perror("error on select");
break;
if (FD_ISSET(0, &fd))
int c = getchar();
if (c == EOF)
puts("EOF");
break;
printf("read char '%c'\n", c);
else
puts("nothing to read");
return 0;
编译和执行(Linux下):
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ (sleep 2 ; echo -n a ; sleep 3 ; echo -n z) | ./a.out
nothing to read
nothing to read
read char 'a'
nothing to read
nothing to read
nothing to read
read char 'z'
EOF
pi@raspberrypi:/tmp $ ./a.out
【讨论】:
这似乎很适合我,我会尝试在我的项目中实现类似的东西,如果它有效,我会告诉你!非常感谢您的快速响应!以上是关于如何:每隔一秒调用一个方法来实现 getchar() 或者如果它为空则继续的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 多线程实现 每隔一秒使text的值加1
显示自最近的数据库 DateTime 以来经过的时间,并每隔一秒增加一次
用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮,8 个灯