- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 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_BUFFERING
或 FILE_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/
正如标题所说,我正在编写一个网络程序,我在其中使用 CreateFile 打开网络驱动程序的句柄,并且我一直在试验 NO_BUFFERING 标志。 大多数文档甚至都不会提及将其与通信设备一起使用,而
最近在 MSDN 中注意到 FILE_FLAG_NO_BUFFERING 标志的详细描述,并阅读了几个关于 Windows 中无缓冲 I/O 的 Google 搜索结果。 http://msdn.mi
我正在使用VB6和Win32 API将数据写入文件,此功能用于导出数据,因此磁盘写入性能是我考虑的关键因素。因此,在调用 CreateFile 打开文件时,我使用 FILE_FLAG_NO_BUFFE
我正在尝试测量 FILE_FLAG_WRITE_THROUGH 和 FILE_FLAG_NO_BUFFERING 对文件写入序列的影响,如 another question 中的请求。但我发现我无法写
我正在使用 Windows ReadFile 函数按顺序读取一个 4GB 的文件,使用 FILE_FLAG_NO_BUFFERING。我使用 64K 的缓冲区,一切正常,但问题是我的数据在当前缓冲区的
我正在 try catch 子进程的输出 (stdout/stderr),特别是如果它异常退出,我可能会得到一些有用的错误输出。 我创建了一个输出文件,并在 STARTF_USESTDHANDLES
考虑这个程序: #include #include int main(int argc, char** argv) { if (argc != 2) return 1; HANDL
一些背景知识:我一直在尝试在对大文件进行 IO 时使用 FILE_FLAG_NO_BUFFERING 标志。我们正在尝试减少缓存管理器的负载,希望通过后台 IO 减少我们的应用程序对用户机器的影响。性
我在使用带有重叠 I/O 的标志 FILE_FLAG_NO_BUFFERING 时观察到一个奇怪的行为。我调用了一系列 ReadFile() 函数调用,稍后使用 GetOverlappedResult
我正在尝试对 NTFS 的文件读取时间(顺序访问)进行基准测试。我的代码获取开始时间,执行大小等于 4096 字节(系统上 NTFS 的簇大小)的读取并记录结束时间。然后存储两个时间之间的差异,并重复
据我所知,然后使用 POSIX O_DIRECT与 open()阻止设备文件的工作方式与组合 FILE_FLAG_WRITE_THROUGH 的工作方式相同和 FILE_FLAG_NO_BUFFERI
大家,我每秒有很多文件写入磁盘,我想禁用磁盘缓存以提高性能,我谷歌搜索找到解决方案:win32 CreateFile 方法与 FILE_FLAG_NO_BUFFERING 和 How to empty
大家,我每秒有很多文件写入磁盘,我想禁用磁盘缓存以提高性能,我谷歌搜索找到解决方案:win32 CreateFile 方法与 FILE_FLAG_NO_BUFFERING 和 How to empty
我是一名优秀的程序员,十分优秀!