在Windows中,即使没有待处理的输入,如何强制C的fread返回?

Mer*_*lli 2 c winapi stdin fread eof

在具有两个线程的Windows程序中:thread1thread2.

thread1fread(buffer, 1, 10, stdin)等待输入的呼叫中被阻止时,是否可以执行某些操作thread2以强制fread返回?

到目前为止,我打过电话fclose(stdin)thread2,但它似乎并没有工作.程序在fclose调用时卡住,直到stdin流中有一些输入为止.

我想要实现的是thread1优雅地终止而不是仅仅用它来杀死它TerminateThread,因为最后还有一些工作thread1需要做.

另一件需要考虑的事情是它stdin是命名管道的一端.我无法控制管道另一端的程序.
我需要的是断开我的程序与管道的末端(stdin在这种情况下).

R..*_*R.. 5

打电话fclose(stdin)是一个非常糟糕的主意; 它会导致未定义的行为,如果它发生在它之前fread(它没有相对于它排序)或者如果线程调用在返回之后fread任何其他事情,并且它没有解除阻塞,因为它无法继续直到它获得锁定,其中 -进度被排除在外.stdinfreadfreadfclosestdinfread

stdio从根本上说你不想在这里做什么.您可以通过第二个管道转发来修补它,另一个线程读取stdin和写入新管道.然后,您可以fread通过关闭它的写入结束来中止管道的读取端.额外的线程仍然会卡住,但是如果你要终止的话,这并不重要.或者(这可能更清晰)您将使用文件描述符(或Windows文件句柄)而不是stdio和poll(或Windows等效的)来确定是否有要读取的输入.您可以结合使用这些方法将特定于Windows的文件句柄逻辑放在额外的线程中(从而能够干净地终止它)并继续stdio在程序逻辑线程中使用portable .