在Windows中重定向进程的输入和输出时,输入不起作用

时间:2017-10-17 17:07:18

标签: c++ c winapi pipe

我想将程序的输入和输出重定向到另一个使用两个线程的程序,一个用于输入进程,另一个用于输出。现在第二个程序从它的stdin读取并写入第一个程序的stdin。类似地,第二个程序从第一个程序的stdout读取并将其写入它的标准输出。而且,我使用匿名管道[CreatePipe()]

执行此操作

我已按照此链接的逻辑:Creating a Child Process with Redirected Input and Output MSDN

但是,到目前为止我能够实现的是我可以正确地重定向stdout,但是当重定向stdin时,scanf()函数不等待获取输入,它们只是简单没有输入!

我的问题是:可能是什么问题?它是Win32 API特有的问题吗? 或一个共同的重定向相关问题?还是缓冲相关的问题?

我甚至记住了这篇文章:Be careful when redirecting both a process’s stdin and stdout to pipes, for you can easily deadlock MSDN

注意:  在第二个程序中,我使用了两个线程进行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;
}

0 个答案:

没有答案