我正在修改一个用 MSDN C 和 Pro*C 编写的命令行程序(用于编写内联 SQL 和 PL/SQL 语句的 Oracle 预编译器),以便可以同时生成和处理多个副本。这是一个数据库繁重的程序,并发问题主要在数据库端处理,所以我们认为只运行多个副本比改变程序以运行真正的多线程更容易。
无论如何,我们依靠 printf() 和输出管道将程序的输出写入日志文件以进行调试。我无法启动适当写入自己的日志文件的 exe 的单独副本。我玩了很多 exec() 和 system() 函数来获取 EXE 的不同副本来启动和写入日志。我最接近工作的是使用 C 行,例如:
system("start cmd /k call [program commmand and args] > log_file.txt");
这很有效 - 生成单独的命令窗口并为适当的数据集生成单独的程序副本。唯一的问题是程序完成执行后命令窗口保持打开状态。我们的一些客户经常在调度程序上运行这个程序,而不得不手动关闭所有命令窗口对他们来说是不可接受的。
我试图找到我正在寻找的其他类似命令如下:
system("[program command and args] > log_file.txt");
或者
exec("[program command and args] > log_file.txt");
这两个都将执行程序的新副本,写入日志文件就好了,并在进程完成后关闭命令窗口,但命令等待新生成的 EXE 完成运行以将控制权返回给启动的可执行文件. 这显然可以防止多个副本同时运行,这是开始的全部目标,所以这也不是一个好的解决方案。
我还尝试通过附加到退出的命令行来尝试将“退出”命令添加到命令行窗口的末尾,希望我可以关闭命令窗口,如下所示:
system("start cmd /k call \"[program commmand and args] > log_file.txt; exit\"");
无济于事。我尝试了一些类似的变化,但永远无法正确的行为。
我将不胜感激任何可以得到正确行为的建议。我基本上希望使用 Windows 命令提示符的“> log_file.txt”输出管道功能启动同时运行的可执行文件的多个副本并写入单独的日志文件。我想避免必须使用线程库(已经有一段时间了,我受到时间限制)或使用 printf() 和输出管道以外的其他东西,因为这些打印语句在整个应用程序中使用,这将是一个很大的努力在这个时间点有效地替换所有的函数调用。
任何人都知道使用 system() 调用关闭命令窗口的方法,或者有其他一些简单的方法来解决问题?请记住,这涉及一些时间限制,因此我不一定要寻找最好的方法来做到这一点,而是寻找最快和最简单的方法。我将有机会很快实现适当的日志记录功能,但我需要先解决这个问题。