gpt4 book ai didi

c++ - 使用 pthreads 查看标准输入

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:43 26 4
gpt4 key购买 nike

我正在尝试使用 pthreads 查看标准输入以查看是否有任何内容。我(认为我)需要这样做,因为如果 std in 中没有任何内容,流访问函数将阻塞输入。

我觉得这样做的方法是启动一个检查 stdin 和 sleep(1) 的 pthread,看看线程是否找到任何东西。

这是我目前所拥有的。如果程序中没有任何内容,那么它将按预期休眠,但如果标准输入中有内容,则线程永远不会被触发。

#include <iostream>
#include <pthread.h>
#include <stdlib.h>

using namespace std;

void *checkStdIn(void *d){
char c = '\0';
c = cin.peek();
if (c){
cout << c << endl;
}
}

int main(int argc, char *argv[]){

pthread_t thread;
int rc;
rc = pthread_create(&thread, NULL, checkStdIn, NULL);
if (rc){
cerr << "Error no. " << rc << endl;
exit(EXIT_FAILURE);
}
sleep(2);

return 0;
}

最佳答案

为此您不需要 pthreads,您可以使用 select(2)poll(2) 来了解您是否可以在不阻塞应用程序的情况下查看标准输入.为此,我编写了 my_peek() 函数,你只需要传递你想要等待输入的秒数(如果你不想等待,你甚至可以传递 0):

/* According to POSIX.1-2001 */
#include <sys/select.h>

/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

#include <iostream>

int
my_peek(unsigned int nsecs)
{
struct timeval timeout;
fd_set rfds;
int fd;

// stdin file descriptor is 0
fd = 0;

timeout.tv_sec = nsecs;
timeout.tv_usec = 0;

FD_ZERO(&rfds);
FD_SET(fd, &rfds);

if (select(fd + 1, &rfds, NULL, NULL, &timeout) > 0)
return std::cin.peek();
return -1;
}

int
main(void)
{
int peek;

peek = my_peek(2);
if (peek != -1) {
std::cout << "we could peek without freezing" << std::endl;
std::cout << "my_peek() returned " << peek << std::endl;
} else {
std::cout << "we could not peek without freezing" << std::endl;
}

return 0;
}

请注意,依靠 select(2) 来判断 cin 对象或 stdin 中是否有数据是错误的 FILE 结构,因为正如 Nemo 所说,它们是缓冲的。最好的办法是在本示例中使用 read(2) 避免“cin”。 my_peek() 的改进版本如下所示:

int
my_peek(unsigned int nsecs)
{
struct timeval timeout;
fd_set rfds;
int fd;
unsigned char c;

// stdin file descriptor is 0
fd = 0;

timeout.tv_sec = nsecs;
timeout.tv_usec = 0;

FD_ZERO(&rfds);
FD_SET(fd, &rfds);

if (select(fd + 1, &rfds, NULL, NULL, &timeout) <= 0)
return -1;
if (read(fd, &c, 1) != 1)
return -1;
return static_cast<int>(c); /* or "return (int)c" for C-only programs */
}

有关更多信息,请查看 select(2) 手册页 http://linux.die.net/man/2/select .

PS:您可以尝试依赖 std::cin.rdbuf()->in_avail() 返回的值,如 cpluplus 站点 http://www.cplusplus.com/reference/iostream/streambuf/in_avail/ 中所述。 ,甚至在 istream 类的 readsome() 方法中,但它们通常依赖于 GNU 中未公开的 FILE 缓冲区C++ 库。不要这样做,否则你可能会失败。

关于c++ - 使用 pthreads 查看标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6848128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com