0 ) { char buf[16384]; buf[16383] = '\0'; if ( fgets ( buf, sizeof ( buf ) - 1, stdin ) == 0 ) return; } fd_集fds; FD_零(&fds); FD_集(0和fds); 结构时间值电视; tv.tv_sec=0; tv.tv_usec=0; 如果(选择(1,&fds,0,0,&tv)>0){ char-buf[16384]; buf[16383]='\0'; 如果(fgets(buf,sizeof(buf)-1,stdin)=0) 返回; },java,c++,select,stdin,fgets,Java,C++,Select,Stdin,Fgets" /> 0 ) { char buf[16384]; buf[16383] = '\0'; if ( fgets ( buf, sizeof ( buf ) - 1, stdin ) == 0 ) return; } fd_集fds; FD_零(&fds); FD_集(0和fds); 结构时间值电视; tv.tv_sec=0; tv.tv_usec=0; 如果(选择(1,&fds,0,0,&tv)>0){ char-buf[16384]; buf[16383]='\0'; 如果(fgets(buf,sizeof(buf)-1,stdin)=0) 返回; },java,c++,select,stdin,fgets,Java,C++,Select,Stdin,Fgets" />

Java与C+之间的通信问题+;stdin上的应用程序 我有一个java应用程序,通过JavaLang.Posion API启动C++应用程序,然后尝试通过STDIN管道发送命令: process.getOutputStream().write("foo\n"); process.getOutputStream().flush(); process.getOutputStream().write(“foo\n”); process.getOutputStream().flush(); 在C++侧有一个循环运行,检查STDIN中的输入,如果有 它读它。不幸的是,检查总是返回0,因此它从不尝试读取。如果我取消检查,那么它将突然开始看到命令并处理它们。这是在linux上实现的 从STDIN检查和读取的C++应用程序代码是: fd_set fds; FD_ZERO ( &fds ); FD_SET ( 0, &fds ); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; if( select ( 1, &fds, 0, 0, &tv ) > 0 ) { char buf[16384]; buf[16383] = '\0'; if ( fgets ( buf, sizeof ( buf ) - 1, stdin ) == 0 ) return; } fd_集fds; FD_零(&fds); FD_集(0和fds); 结构时间值电视; tv.tv_sec=0; tv.tv_usec=0; 如果(选择(1,&fds,0,0,&tv)>0){ char-buf[16384]; buf[16383]='\0'; 如果(fgets(buf,sizeof(buf)-1,stdin)=0) 返回; }

Java与C+之间的通信问题+;stdin上的应用程序 我有一个java应用程序,通过JavaLang.Posion API启动C++应用程序,然后尝试通过STDIN管道发送命令: process.getOutputStream().write("foo\n"); process.getOutputStream().flush(); process.getOutputStream().write(“foo\n”); process.getOutputStream().flush(); 在C++侧有一个循环运行,检查STDIN中的输入,如果有 它读它。不幸的是,检查总是返回0,因此它从不尝试读取。如果我取消检查,那么它将突然开始看到命令并处理它们。这是在linux上实现的 从STDIN检查和读取的C++应用程序代码是: fd_set fds; FD_ZERO ( &fds ); FD_SET ( 0, &fds ); struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; if( select ( 1, &fds, 0, 0, &tv ) > 0 ) { char buf[16384]; buf[16383] = '\0'; if ( fgets ( buf, sizeof ( buf ) - 1, stdin ) == 0 ) return; } fd_集fds; FD_零(&fds); FD_集(0和fds); 结构时间值电视; tv.tv_sec=0; tv.tv_usec=0; 如果(选择(1,&fds,0,0,&tv)>0){ char-buf[16384]; buf[16383]='\0'; 如果(fgets(buf,sizeof(buf)-1,stdin)=0) 返回; },java,c++,select,stdin,fgets,Java,C++,Select,Stdin,Fgets,正如我所说,删除if子句可以使它工作,但当然这并不是很好,因为它周围的循环还可以做其他一些事情。有人知道我做错了什么吗 更新: 同时,我能够用两个非常小的示例应用程序重现这个问题。这里的问题似乎与Qt框架有关,只要我创建了框架所需的QCoreApplication实例,那么stdin的select()似乎就不起作用了。我可能错了,但是select调用的超时值为0有意义吗?我会尝试增加超时值。我可能错了,但是select调用的超时值为0有意义吗?我会尝试增加超时值。您有两个if;删除哪一个使其工作

正如我所说,删除if子句可以使它工作,但当然这并不是很好,因为它周围的循环还可以做其他一些事情。有人知道我做错了什么吗

更新:
同时,我能够用两个非常小的示例应用程序重现这个问题。这里的问题似乎与Qt框架有关,只要我创建了框架所需的QCoreApplication实例,那么stdin的select()似乎就不起作用了。

我可能错了,但是
select
调用的超时值为0有意义吗?我会尝试增加超时值。

我可能错了,但是
select
调用的超时值为0有意义吗?我会尝试增加超时值。

您有两个if;删除哪一个使其工作


不等待换行符、缓冲区已满或EOF返回吗?我没有看到你在写换行符,“foo”不会填满缓冲区,而且由于流没有关闭,它会看到EOF吗?

你有两个if;删除哪一个使其工作


不等待换行符、缓冲区已满或EOF返回吗?我没有看到你写换行符,“foo”没有填满缓冲区,而且由于流没有关闭,它是否看到了EOF?

我记得有很多关于select()的语义和操作的争论,以及它的几个替换。你可以看看那些

您正在阅读的流是如何创建/打开的?它是缓冲流吗?也许您什么也得不到,因为在写入过程刷新流之前,它还没有写入流

您可以尝试的另一件事是将它放在一个线程上,使用阻塞I/O而不是轮询


祝你好运

我记得有很多关于select()的语义和操作的争论,还有一些替换。你可以看看那些

您正在阅读的流是如何创建/打开的?它是缓冲流吗?也许您什么也得不到,因为在写入过程刷新流之前,它还没有写入流

您可以尝试的另一件事是将它放在一个线程上,使用阻塞I/O而不是轮询


幸运的是,它不是QCore应用程序,因为我现在可以两次重现这个问题,而不需要out。似乎问题出在我使用的fgets()上,用read()代替fgets()修复了它。

结果它不是QCoreApplication,因为我现在可以在不使用out的情况下重现两次问题。似乎问题出在我使用的fgets()上,用read()替换它可以解决问题。

下面的内容是否在while循环中?如果不是,应该是这样

FD_ZERO ( &fds );
FD_SET ( 0, &fds );

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
如果我的第一个问题的答案是“是”,请尝试此超时:

tv.tv_sec = 0;
tv.tv_usec = 1;
如果上述方法无效,请尝试以下方法:

while(fgets(buf, sizeof ( buf ) - 1, stdin) !=NULL) 
{ 
}

下面的代码是否在while循环中?如果不是,应该是这样

FD_ZERO ( &fds );
FD_SET ( 0, &fds );

struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
如果我的第一个问题的答案是“是”,请尝试此超时:

tv.tv_sec = 0;
tv.tv_usec = 1;
如果上述方法无效,请尝试以下方法:

while(fgets(buf, sizeof ( buf ) - 1, stdin) !=NULL) 
{ 
}

不改变任何东西来增加它(尝试了500个usecs)不改变任何东西来增加它(尝试了500个usecs)第一个if和yes,我在这里提供的写入没有反映我在代码中的内容,只是改变了它。第一个if和yes,我在这里提供的写入没有反映我在代码中的内容,刚才更改了。应该是
sizeof(path)
而不是
sizeof(path)-1
应该是
sizeof(path)
而不是
sizeof(path)-1
应该使用
fgets(buf,sizeof(buf),stdin)
不是
sizeof(buf)-1
应该使用
fgets(buf,sizeof(buf),stdin)
不是
sizeof(buf)-1