[英]in windows, how to have non-blocking stdin that is a redirected pipe?
我有一個Windows C程序通過重定向的stdin
管道獲取其數據,如下所示:
./some-data-generator | ./myprogram
問題是我需要能夠以非阻塞的方式從stdin
讀取。 原因是(1)輸入是數據流,沒有EOF
,(2)程序需要能夠在任何時候中止其stdin
讀取線程。 fread
塊時,有沒有數據,所以這使得它非常困難。
在Unix中,這沒有問題,因為您可以使用fcntl
和O_NONBLOCK
設置文件描述符的阻塞模式。 但是,Windows上不存在fcntl
。
我嘗試使用SetNamedPipeHandleState
:
DWORD mode= PIPE_READMODE_BYTE|PIPE_NOWAIT;
BOOL ok= SetNamedPipeHandleState(GetStdHandle(STD_INPUT_HANDLE), &mode, NULL, NULL);
DWORD err= GetLastError();
但這與ERROR_ACCESS_DENIED
( 0x5
)失敗。
我不知道還能做什么。 這實際上是不可能的(!)還是只是高度混淆了? 對於這個特定問題,網絡上的資源相當稀少。
訂單apprach,檢查有輸入准備閱讀:
您可以使用異步I / O從句柄讀取,例如ReadFileEx()WIN32調用。 在沒有輸入的情況下使用CancelIo()終止讀取。
有關MSDN,請訪問http://msdn.microsoft.com/en-us/library/aa365468(VS.85).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.