簡體   English   中英

在Windows中,如何使用非阻塞stdin作為重定向管道?

[英]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中,這沒有問題,因為您可以使用fcntlO_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_DENIED0x5 )失敗。

我不知道還能做什么。 這實際上是不可能的(!)還是只是高度混淆了? 對於這個特定問題,網絡上的資源相當稀少。

訂單apprach,檢查有輸入准備閱讀:

  • 對於控制台模式,您可以使用GetNumberOfConsoleInputEvents()。
  • 對於管道重定向,您可以使用PeekNamedPipe()

您可以使用異步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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM