我这里有一个Java应用程序,它通过java.lang.Process API启动C++应用程序,然后尝试通过stdin管道向其发送命令:

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(选择(1,&fds,0,0,&tv)> 0){
char buf [16384];
buf [16383] ='\ 0';
if(fgets(buf,sizeof(buf)-1,stdin)== 0)
返回;
}

就像我说的,删除if子句可以使它工作,但是那并不是那么好,因为围绕它的循环还可以做其他一些事情。有人知道我在这里做错了吗?

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

最佳答案

您有两个if;删除哪个使它工作?

fgets()在返回之前是否不等待换行符,缓冲区已满或EOF?我看不到您在写换行符,“foo”没有填充缓冲区,并且由于流没有关闭,因此它看到EOF了吗?

09-10 05:16
查看更多