可以从用户检索输入并运行另一个进程

Possible to retrieve input from user and running another process?

本文关键字:运行 另一个 进程 输入 检索 用户      更新时间:2023-10-16

是否可以在我的程序顶部使用getline(cin,buffer);,然后在它下面仍然运行一个"动画菜单"?例如(非常基本):

#include <iostream> 
#include <string> 
using namespace std; 
int stringLen=0;
string buffer; 
getline(cin, buffer);
for (int i = 0; i < kMaxWait;i++)
{
     printf("counter waiting for user input %d",i);
     if (1 >= buffer.length())
     break; 
}

我是否必须以某种方式分叉该循环,以便它继续计数并显示计数器,直到用户输入某些内容?

注释中给出的一个可能的答案是使用线程。但这不是必需的,有一种方法可以在没有线程的情况下做到这一点。

  • 使 stdin 成为非阻塞文件描述符。

  • 等待 stdin 变得可读,通过 poll()/select(),同时做你的动画,等等......

  • 再次使 stdin 成为阻塞文件描述符。

  • 使用 std::getline()。

还有一些辅助问题需要考虑,例如来自std::streambuf的缓冲,所以在执行所有这些操作之前,请先检查是否已经有内容要从std::cin读取。

这是我

前段时间用过的东西。这很简陋,但您可以了解该过程的要点 - 使用 poll .如果有输入,则返回 true,并将其放入 str 中,否则为 false。因此,您可以将其放在循环中的某个地方,并在有输入时采取行动。

bool polled_input(std::string& str)
{
    struct pollfd fd_user_in;
    fd_user_in.fd = STDIN_FILENO;
    fd_user_in.events = POLLIN;
    fd_user_in.revents = 0;
    int rv = poll(&fd_user_in, 1, 0);
    if (rv == -1) {/* error */}
    else if (rv == 0) return false;
    else if (fd_user_in.revents & POLLIN)
    {         
        char buffer[MAX_BUFF_SIZE];
        int rc = read(STDIN_FILENO, buffer, MAX_BUFF_SIZE-1);
        if (rc >= 0) 
        {
            buffer[rc]='';
            str = std::string(buffer);
            return true;       
        }
        else {/* error */}
    }        
    else {/* error */}
}
select就是

为此而设计的,多路复用,阻塞I/O。我认为可以在没有poll的情况下完成:

#include <iostream>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char **arg)
{
   const int time_in_secs = 10;
   const int buffer_size = 1024;
   fd_set readfds;
   FD_ZERO(&readfds);
   FD_SET(STDIN_FILENO, &readfds);
   struct timeval tv;
   tv.tv_sec = time_in_secs;
   tv.tv_usec = 0;
   int ret = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv);
   if (!ret)
   {
       std::cout << "Timeoutn";
       exit(1);
   }
   char buf[buffer_size];
   if (FD_ISSET(STDIN_FILENO, &readfds))
   {
        int len = read(STDIN_FILENO, buf, buffer_size);
        buf[len] = '';
   }
    std::cout << "You typed: " << buf << "n";
    return 0;
}