如标题所示,我正在尝试重定向标准输出,要测试,我有以下程序:

#include <windows.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>

#define BUFFER_SIZE 4096

int main(int argc, char* argv[])
{
    int fdStdOutPipe[2];
    int fdStdOut;

    printf("Console Print...\n");

    // Start
    fflush(stdout);
    _pipe(fdStdOutPipe, BUFFER_SIZE, O_RAW);
    fdStdOut = _dup(_fileno(stdout));
    _dup2(fdStdOutPipe[1], _fileno(stdout));
    setvbuf( stdout, NULL, _IONBF, 0 );
    fdStdOut = _dup(_fileno(stdout));

    printf("Buffer Print...\n");

    char buffer[ BUFFER_SIZE ] = "";

    while( _read( fdStdOutPipe[0], buffer, BUFFER_SIZE ) )
    {
        // Test
        int l = strlen( buffer );
        buffer[ 0 ] = 0;
    }


    // Close
    _dup2(fdStdOut, _fileno(stdout));
    _close(fdStdOut);
    _close(fdStdOutPipe[0]);
    _close(fdStdOutPipe[1]);

    printf("Console Print Again...\n");

    return 0;
}

我有的问题是,如果stdout管道为空,则_read之后会阻塞...我的印象是管道默认情况下为非阻塞。有什么方法可以使上面示例中的管道变为非阻塞状态?

最佳答案

在调用_read()之前,检查管道状态可以解决问题。我在VC++上使用此代码,并且工作正常。

struct _stat st;
if(_fstat(fdStdOutPipe[0], &st)) {
    // do error handling
}
if (st.st_size) {
    // data is available to read
    while(_read(...)) {
    }
}

09-16 05:26