我开发了一个在Windows和Linux下使用的c ++ CGI应用程序。 它必须启动另一个应用程序。目前我正在使用系统调用:
system("anotherApp.exe -arguments");
对于该调用,我需要对Windows上的cmd.exe执行权限,导致系统调用启动shell。这是一个安全问题,因为我的应用程序是一个CGI应用程序并在网络服务器上使用。
在没有启动新shell的情况下调用应用程序是否还有其他可能性?
答案 0 :(得分:2)
您可以使用CreateProcess并使用该命令设置安全权限。您还可以模拟受限用户,以确保您调用的进程仅具有您为其提供的权限。
答案 1 :(得分:1)
System()启动一个控制台窗口并在该控制台窗口中运行该程序。
popen()在没有控制台窗口的情况下运行程序,并将控制台输出重定向到管道。
CreateProcess()只是启动程序。你传递一个flags参数,告诉它如何处理控制台。它还允许程序以对父程序的不同权限运行。
如果您没有cmd.exe的权限,则系统()不在菜单中。
只要程序不需要写入stdout或stderr,popen()就可以工作了,因为它会丢失。你可能最好写下这样的东西:
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;
}