来自其他线程的select()不处理传入数据
select() from other thread not handle incoming data
我有多线程应用程序。在一个线程中,我想等待数据,如果这些数据在一段时间内不会出现,我就关闭整个应用程序。函数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发送命令
相关文章:
- 使用流处理接收到的数据
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 我可以使用哪种数据结构来处理这种方式
- OpenCV(C++)处理来自JavaScript / Web Assembly的图像数据
- 在线程函数中处理数据向量时进行线程竞速
- 而(getline(fin,str)){}即使在到达eof之后仍在处理数据
- 如何以低于相机每秒帧数的能力处理数据?
- 处理数据包的设计模式
- C 图像处理数据块进入数组 /指针
- 如何使用 C++ 驱动程序在 MongoDB 中使用 UserException 处理数据类型错误
- 实时绘图的信号处理数据(c++中的FFT和GNUPLOT)
- 处理数据的方法,速度是我处理速度的两倍
- 如何使用STL迭代器和reverse_iterator处理数据
- MFC树视图控件:寻找一种万无一失的方法来处理数据
- 从套接字递归处理数据
- boost::p roperty_:tree - 解析和处理数据
- 这段代码是否在作为参数传递时处理数据有点困惑
- 神经网络似乎工作得很好,直到用于处理数据(所有的结果几乎是相同的)
- 在托管c#应用程序的非托管c++ Dll调用中,如何处理数据类型之间的冲突