C++ 是否可以从用户检索输入并运行另一个进程?

C++ 是否可以从用户检索输入并运行另一个进程?,c++,C++,是否可以使用getlinecin,缓冲区;在我的程序顶部,下面还有一个动画菜单吗? 例如,非常基本的: #include <iostream> #include <string> using namespace std; int stringLen=0; string buffer; getline(cin, buffer); for (int i = 0; i < kMaxWait;i++) { printf("counter waitin

是否可以使用getlinecin,缓冲区;在我的程序顶部,下面还有一个动画菜单吗? 例如,非常基本的:

#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变得可读,通过轮询/选择,同时制作动画,等等

再次将stdin设为阻塞文件描述符

使用std::getline


还有一些附加的问题要考虑,比如来自STD的缓冲::StudiBuf,所以在做这些之前,检查是否已经有东西可以从STD::CIN中读取。首先,

< P> >在注释中给出的一个可能的答案是使用线程。但这不是必须的,有一种方法可以不用线程来实现

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

等待stdin变得可读,通过轮询/选择,同时制作动画,等等

再次将stdin设为阻塞文件描述符

使用std::getline


还有一些附加的问题要考虑,比如来自STD的缓冲::StudiBuf,所以在做这些之前,检查是否已经有东西可以从STD::CIN,首先。

< P>阅读。这是我以前使用过的东西。这是非常基本的,但是你可以通过民意测验了解这个过程的要点。如果有输入,则返回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]='\0';
            str = std::string(buffer);
            return true;       
        }
        else {/* error */}
    }        
    else {/* error */}
}

这是我以前用过的东西。这是非常基本的,但是你可以通过民意测验了解这个过程的要点。如果有输入,则返回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]='\0';
            str = std::string(buffer);
            return true;       
        }
        else {/* error */}
    }        
    else {/* error */}
}
select用于多路复用、阻塞I/O。我认为,无需轮询即可完成:

select用于多路复用、阻塞I/O。我认为,无需轮询即可完成:


输入阻塞执行。您需要线程/任务。为什么要将其标记为?你似乎知道使用叉子是可能的。一般来说,您会使用std::线程等待缓冲区中的更改it@Robolisk如果您确实想要/需要其他流程,您可以使用fork来实现这种行为,对buffer.length的访问在任何情况下都需要同步。输入阻止执行。您需要线程/任务。为什么要将其标记为?你似乎知道使用叉子是可能的。一般来说,您会使用std::线程等待缓冲区中的更改it@Robolisk如果您确实想要/需要其他流程,您可以使用fork来实现这种行为,对buffer.length的访问在任何情况下都需要同步。因此,基本上建议在select/poll循环中使用stdin fd,对吗?那是另一种方式,我明白你的意思,索塔。在某种程度上,我给出的动画块示例非常基本。这实际上是一个相当大的文件,在命令窗口中执行ascii art类型的动画,直到用户输入数据日志为止,无论其范围有多广。原理是一样的。实际上这是一个非常优雅的解决方案。在我到达那里之前,我读了几遍,但最终我得到了+1。这是一条路线,还是使用fork更有效?因此基本上建议在选择/轮询循环中使用stdin fd,对吗?那是另一种方式,我明白你的意思,索塔。在某种程度上,我给出的动画块示例非常基本。这实际上是一个相当大的文件,在命令窗口中执行ascii art类型的动画,直到用户输入数据日志为止,无论其范围有多广。原理是一样的。实际上这是一个非常优雅的解决方案。在我到达那里之前,我读了几遍书,但最后我得到了一个+1。这条路线,还是使用fork更有效?