Cプログラム(win32 API)内でstdinを選択したファイルにリダイレクトしようとしていますが、stderrまたはstdoutもリダイレクトする可能性があります。
私はcygwinで実行しているシェルを書いています。望ましい効果は、 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);
}
この stdin リダイレクトが機能しません。何が間違っていますか?
ありがとうございました !