gpt4 book ai didi

c++ - 如何将 STDIN 传递给子进程?

转载 作者:可可西里 更新时间:2023-11-01 16:45:55 25 4
gpt4 key购买 nike

cmd_more

void WriteToPipe(void)

// Read from a file and write its contents to the pipe for the child's STDIN.
// Stop when there is no more data.
{
DWORD dwRead, dwWritten;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
char * name = malloc(100);


fgets(name, 100, stdin);


bSuccess = WriteFile(g_hChildStd_IN_Wr, name, 10, &dwWritten, NULL);
if (!bSuccess)
ErrorExit("");

}

void ReadFromPipe(void)

// Read output from the child process's pipe for STDOUT
// and write to the parent process's pipe for STDOUT.
// Stop when there is no more data.
{
DWORD dwRead, dwWritten;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);


bSuccess = ReadFile(g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
if (!bSuccess || dwRead == 0)
return 100;

bSuccess = WriteFile(hParentStdOut, chBuf,
dwRead, &dwWritten, NULL);
if (!bSuccess)
return 101;

}

主要(未全):

while (1)
{
Sleep(500);

ReadFromPipe();

WriteToPipe();


}

我正在尝试将 cmd 作为子进程打开,并将父输入传递给子 STDIN 流,而不是打印子进程的 STDOUT。

如您所见,它在第一次运行时有效,但后来我得到了这个“更多?”从子进程(cmd)返回,然后卡住等待输出。

为什么我得到这个“更多”?回来了吗?

“更多”是什么?

最佳答案

我发现父输入重定向的唯一方法是创建一个额外的线程。常见的算法是:

  1. 创建管道 - (hPipeRead, hPipeWrite)
  2. 使用标准输入创建子进程 - hPipeRead
  3. 在正在读取 GetStdHandle(STD_INPUT_HANDLE) 并立即将读取缓冲区写入 hPipeWrite 的父进程中创建新线程。当 stdInput 结束时,线程完成。
  4. 父进程正在等待额外的线程

Microsoft support article中描述了这种方式.

关于c++ - 如何将 STDIN 传递给子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23490030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com