如标题所示,我正在尝试重定向标准输出,要测试,我有以下程序:
#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(...)) {
}
}