来自其他线程的select()不处理传入数据

select() from other thread not handle incoming data

本文关键字:处理 数据 其他 线程 select      更新时间:2023-10-16

我有多线程应用程序。在一个线程中,我想等待数据,如果这些数据在一段时间内不会出现,我就关闭整个应用程序。函数select()在另一个线程中运行,线程是detach

某类的碎片

#define STDIN 0
A::A(){
   runFunction1();
   runFunction2();
   thread listen(&A::isData , this);
   listen.detach();
}
// and function with select
void A::isData{
 struct timeval tv;
    fd_set readfds;
    tv.tv_sec = 50; // wait to 50 seconds
    tv.tv_usec = 500000;
    FD_ZERO(&readfds);
    FD_SET(STDIN, &readfds);
    for(;;) {
        select(STDIN+1, &readfds, NULL, NULL, &tv);
        if (FD_ISSET(STDIN, &readfds)){
            cout << "I something catch :)" << endl;
            // reset time
        }else{
            cout << "I nothing catch ! By By :(" << endl;
            exit(1);
            break;
        }
    }
}

如果我的程序运行,那么我会得到pid,所以我尝试用以下方式向文件描述符写入一些数据:

$ cd /proc/somePID/fd
$ echo 1 >> 0

然后我应该得到信息我什么都没抓到:)但在控制台IDE中我只得到1,但如果时间到了,我就得到什么都没抓住!按:(到IDE.中的控制台

编辑:已解决

@Vladimir Kunschikov给了我正确的提示。在此基础上,我展示了我如何在C/C++中做到这一点

可以使用命令echo发送一些要处理的内容,我们必须创建管道。管道使用功能

A::A(){
       fd[2]; //two file descriptor for pipes write/read
       pipe(fd); // c function to create pipes
       runFunction1(); 
       runFunction2();
       thread listen(&A::isData , this);
       listen.detach();
    }

然后在我们的过程中,将创建另外两个新的文件描述符,如下所示:

lrwx------ 1 user user 64 gru 15 14:02 0 -> /dev/pts/0
lrwx------ 1 user user 64 gru 15 14:02 1 -> /dev/pts/0
lrwx------ 1 user user 64 gru 15 14:02 2 -> /dev/pts/1
lr-x------ 1 user user 64 gru 15 14:02 3 -> pipe:[1335197]
lrwx------ 1 user user 64 gru 15 14:02 4 -> socket:[1340788]
l-wx------ 1 user user 64 gru 15 14:02 5 -> pipe:[1335197]

管道:[1335197]是要在此过程中读取的描述符。现在,如果我们将一些写入描述符3,命令echo将起作用。使用简单:

$ cd /proc/PID/fd
$ echo 1 > 3

然后我们也可以在select()函数中使用它,但描述符编号是3,所以定义应该是这样的。

#define STDIN 3

并且工作

您错误地认为写入/proc/pidof application/fd/0会将数据放入应用程序的stdin流。只需阅读这个问题的答案:使用stdin通过/proc/{pid}/fd/0 向java-jar发送命令