gpt4 book ai didi

c++ - 子进程的标准输出/标准错误文件为空,FILE_FLAG_NO_BUFFERING 不工作

转载 作者:太空宇宙 更新时间:2023-11-04 13:48:08 27 4
gpt4 key购买 nike

我正在 try catch 子进程的输出 (stdout/stderr),特别是如果它异常退出,我可能会得到一些有用的错误输出。

我创建了一个输出文件,并在 STARTF_USESTDHANDLES 上设置了这个(和 STARTUPINFO )我随后传递给 CreateProcess() 的结构.

现在,对于子进程中的不同操作,我得到以下行为:

(1) 无冲洗

printf("Hello world!\n");

结果:子进程从父进程终止后(通过 TerminateProcess ):文件中没有输出。

(2) 使用 fflsuh()在每个 printf 之后打电话

printf("Hello world!\n");
fflush(stdout);

结果:子进程从父进程终止后(通过 TerminateProcess ):“Hello World!” (如预期的那样)

(3)异常终止

printf("Hello world!\n");
int *p = NULL; *p = 5; // Access violation

结果:文件中没有输出。

我可以尝试添加 fflush()在每 printf() 之后调用(恶心!),或试图找到 TerminateProcess() 的替代品确保首先关闭文件句柄。但这对异常退出没有帮助 - 这是首先要捕获 stdout/stderr 的要点。

我尝试过的另一件事是使用 FILE_FLAG_NO_BUFFERING 创建文件标志设置,但我尝试这样做不起作用 - CreateFile()失败(错误 87“参数不正确”)。知道我做错了什么吗?或者是否有其他方法可以实现此目的?

我为 CreateFile() 尝试了 3 种不同的选择dwFlagsAndAttributes值,结果如下。

  • FILE_ATTRIBUTE_NORMAL - 文件创建正常,但我得到了上述行为(所以我错过了异常终止的数据)。

  • FILE_FLAG_NO_BUFFERINGFILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING - CreateFile()失败,GetLastError = 87 和 FormatMessage返回“参数不正确”。我只是在这里错误地使用了标志吗?还是我的文件系统不支持此选项?

这是我用来创建输出文件和子进程的代码。我在下面标记了我为 CreateFile() 尝试了几个不同的选项。 dwFlagsAndAttributes值(value)。

SECURITY_ATTRIBUTES security = {sizeof(SECURITY_ATTRIBUTES), NULL, true}; // Allow the handle to be inherited by child process
HANDLE myfile = CreateFile(myfilename,
FILE_APPEND_DATA,
FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
&security,
OPEN_ALWAYS,
FILE_FLAG_NO_BUFFERING, // I've tried 3 different things here - see above
NULL);

STARTUPINFO startupInfo = {0};
startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
startupInfo.wShowWindow = SW_HIDE;
startupInfo.hStdError = myfile;
startupInfo.hStdOutput = myfile;

PROCESS_INFORMATION processInfo = {0};

CreateProcess(NULL,
executable,
NULL, NULL,
true, // Allow stdout/err file handle to be inherited
0, NULL, NULL,
&startupInfo,
&processInfo))
CloseHandle(myfile); // The child owns this now

感谢您的帮助!

最佳答案

感谢 Igor 和 Harry 在评论中建议这种方法。

  • 不要使用 FILE_FLAG_NO_BUFFERING 标志。这仅适用于需要直接硬件控制的情况。
  • 在子进程开始时调用 setvbuf(stdout, NULL, _IONBF, 0) 大致等同于在每个 printf 之后调用 fflush > 打电话。也为 stderr 调用 setvbuf

关于c++ - 子进程的标准输出/标准错误文件为空,FILE_FLAG_NO_BUFFERING 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24830715/

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