我有多线程的应用程序。在一个线程中我想等待数据,如果这个数据不会出现一段时间,我只关闭整个应用程序。函数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
并且工作
答案 0 :(得分:0)
您错误地认为写入/ proc / pidof application
/ fd / 0会将数据放入应用程序的stdin流。
只需阅读此问题的答案:Sending command to java -jar using stdin via /proc/{pid}/fd/0