2
我正在嘗試將stdin重定向到我選擇的文件中,在C程序(win32 API)中留下重定向stderr或stdout的可能性。如何使用win32 API將stdin重定向到C文件?
我正在寫一個我在cygwin上運行的shell,期望的效果是讓貓<文件 工作。
這是我到目前爲止的代碼:
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);
}
這個標準輸入重定向不工作,我究竟做錯了什麼?
謝謝!
再次檢查代碼,我編輯它加入你說什麼,我要麼不明白你在說什麼,或者我在做別的事情不對 – pAndrei
是的,請給它一個嘗試 –
呃,我剛剛在我的第一個評論中說,它不起作用。我也在創建過程後關閉句柄,所以這不是問題 – pAndrei