【问题标题】:select() from other thread not handle incoming data来自其他线程的 select() 不处理传入数据
【发布时间】:2015-12-15 21:13:32
【问题描述】:

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

然后我应该得到信息 I something catch :) 但在控制台 IDE 中我只得到 1 ,但是如果时间到了我得到 我什么都没有! By By :( 到 IDE 中的控制台。

编辑:已解决

@Vladimir Kunschikov 给了我正确的提示。在此基础上,我将展示我如何在 C/C++

中做到这一点

可以使用命令echo发送一些东西来处理,我们必须创建pipe。使用函数的管道

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] 是要在此过程中读取的描述符。现在,如果我们将一些内容写入描述符 3,命令 echo 将起作用。使用很简单:

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

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

#define STDIN 3

并且有效

【问题讨论】:

    标签: c++ select


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2019-02-20
      • 1970-01-01
      相关资源
      最近更新 更多