我想将程序的输入和输出重定向到另一个使用两个线程的程序,一个用于输入进程,另一个用于输出。现在第二个程序从它的stdin读取并写入第一个程序的stdin。类似地,第二个程序从第一个程序的stdout读取并将其写入它的标准输出。而且,我使用匿名管道[CreatePipe()]
执行此操作我已按照此链接的逻辑:Creating a Child Process with Redirected Input and Output MSDN
但是,到目前为止我能够实现的是我可以正确地重定向stdout,但是当重定向stdin时,scanf()函数不等待获取输入,它们只是简单没有输入!
我的问题是:可能是什么问题?它是Win32 API特有的问题吗? 或一个共同的重定向相关问题?还是缓冲相关的问题?
注意: 在第二个程序中,我使用了两个线程进行I / O重定向。一个用于输入,一个用于输出。并且,通过“非常难看的伎俩”,我一直使用PIPE HANDLE作为FILE *。
P.S。:这是我在stackoverflow中的第一个问题。如果我违反任何提出问题的规则,请原谅我。
编辑: 我重定向的I / O程序:
char name[256];
char school[256];
int age = -1;
strcpy(name, "(_null)");
strcpy(school, "(_null)");
printf("What's your name?\n");
int n = scanf("%s", name);
printf("\n\nscanf()=%d\n", n); //this prints -1
printf("What's your age?\n");
scanf("%d", &age);
我用来执行I / O重定向的两个线程例程:
rdpipe-> m_stdout 和 rdpipe-> m_stdin 都是来自stdio.h的 FILE 类型,但 m_stdout 只读, m_stdin 只写。
bool fexit = false;
void func_out(RDPIPE *rdpipe) {
char buf[1024];
while(true) {
fgets(buf, 1024, stdin);
if(fexit) break;
fwrite(buf, 1, strlen(buf), rdpipe->m_stdin);
if(fexit) break;
}
}
void func_in(RDPIPE *rdpipe) {
char buf[4096];
while(!feof(rdpipe->m_stdout)) {
int n = fread(buf, 1, 4096, rdpipe->m_stdout);
fwrite(buf, 1, n, stdout);
}
fexit = true;
}