我开发了一个在 Windows 和 Linux 下使用的 c++ CGI 应用程序。它必须启动另一个应用程序。目前我正在使用系统调用:
system("anotherApp.exe -arguments");
对于该调用,我需要在 Windows 上执行 cmd.exe 的权限,因为系统调用会启动一个 shell。这是一个安全问题,因为我的应用程序是 CGI 应用程序并在网络服务器上使用。
是否有另一种可能在不启动新外壳的情况下调用应用程序?
您可以使用CreateProcess并使用该命令设置安全权限。您还可以模拟受限用户,以确保您正在调用的进程仅具有您授予它的权限。
System() 启动控制台窗口并在该控制台窗口中运行程序。
popen() 在没有控制台窗口的情况下运行程序,并将控制台输出重定向到管道。
CreateProcess() 只是启动程序。你传递一个 flags 参数告诉它如何处理控制台。它还允许程序以对父程序的不同权限运行。
如果您没有 cmd.exe 的权限,则 system() 不在菜单中。
popen() 可以工作,只要程序不需要写入 stdout 或 stderr,因为这将丢失。
你可能最好写这样的东西:
bool RunProgram(const std::string &sProgram, bool bWaitForFinish)
{
#if defined(Win32)
// Launch with CreateProcess()
// wait if required
#else
// launch with fork()/exec() or even system()
// wait if required
#endif
return error_status;
}