gpt4 book ai didi

c - 如何使用 win32 API 将标准输入重定向到 C 中的文件?

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:55 24 4
gpt4 key购买 nike

我正在尝试将 stdin 重定向到我选择的文件,在 C 程序(win32 API)中留下重定向 stderr 或 stdout 的可能性。

我正在编写一个在 cygwin 上运行的 shell,所需的效果是让 cat < file工作。

到目前为止,这是我的代码:

    static HANDLE createinputHandle(PCSTR filename, SECURITY_ATTRIBUTES sa)
{
return CreateFile(
filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
}


static VOID RedirectHandle(STARTUPINFO *psi, HANDLE hFile, INT opt)
{
if (hFile == INVALID_HANDLE_VALUE)
return;

psi->dwFlags |= STARTF_USESTDHANDLES;

switch (opt) {
case STD_INPUT_HANDLE:
psi->hStdInput = GetStdHandle(STD_INPUT_HANDLE);
psi->hStdInput = hFile;
break;
case STD_OUTPUT_HANDLE:
psi->hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
psi->hStdOutput = hFile;
break;
case STD_ERROR_HANDLE:
psi->hStdError = GetStdHandle(STD_ERROR_HANDLE);
psi->hStdError = hFile;
break;
}

command_func() {
STARTUPINFO si;
PROCESS_INFORMATION pi;
bool result;
DWORD wait_result;
HANDLE inHandle, outHandle, errHandle;
SECURITY_ATTRIBUTES sa;

ZeroMemory(&si, sizeof(si)); //macro to init with zero's
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&sa, sizeof(sa));
sa.bInheritHandle = TRUE;

inHandle = INVALID_HANDLE_VALUE;
outHandle = INVALID_HANDLE_VALUE;
errHandle = INVALID_HANDLE_VALUE;

if(inputFile != NULL) {

inHandle = createinputHandle(inputFile, sa);
SetHandleInformation(inHandle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
//added
RedirectHandle(&si, inHandle, STD_INPUT_HANDLE);

}


result = CreateProcess(
NULL,
cmd, /*if you want to test this, you need to change cmd to something like "ls -l" */
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi);
}

这个标准输入重定向不起作用,我做错了什么?

谢谢!

最佳答案

你几乎成功了 :) 使用 :::SetHandleInformation(inHandle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);

关于c - 如何使用 win32 API 将标准输入重定向到 C 中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15722273/

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