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

时间:2015-12-15 10:41:53

标签: c++ select

我有多线程的应用程序。在一个线程中我想等待数据,如果这个数据不会出现一段时间,我只关闭整个应用程序。函数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]

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

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

然后我们也可以在select()函数中使用它,但描述符号是3,所以define应该是看起来像。

#define STDIN 3

并且工作

1 个答案:

答案 0 :(得分:0)

您错误地认为写入/ proc / pidof application / fd / 0会将数据放入应用程序的stdin流。 只需阅读此问题的答案:Sending command to java -jar using stdin via /proc/{pid}/fd/0