如何:每隔一秒调用一个方法来实现 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 以来经过的时间,并每隔一秒增加一次

SimpleAdapter 每隔一秒启动一次就崩溃一次

用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮,8 个灯

用延时器和定时器编写一段程序。要求实现8盏灯从上到下每隔一秒亮一盏,全亮一秒在从下到上亮一遍如此循环

android应用内存占用测试(每隔一秒打印procrank的信息)