我使用CreateProcess编写了Win32的子命令执行代码:
CreateProcessW(NULL, // app
&commandW[0], // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&startup_info, // STARTUPINFOW pointer
&process_info); // receives PROCESS_INFORMATION
这使用“技巧”并将整个命令放在第二个参数中,该参数通常只包含传递给程序的参数。我想为POSIX做同样的事情,但同样的“技巧”不适用于execlp
功能(我也打赌所有其他功能)。有没有办法继续使用单个std::string command
并启动流程?将命令拆分为可执行文件名并且参数是可能的,但是如果可能的话我还想做很多工作。
答案 0 :(得分:1)
你可以调用一个shell,并将大字符串传递给shell,然后让shell处理它。亲自尝试一下:
sh -c "echo 'hello world'"
(即传递两个参数,“-c
”和包含命令和参数的大字符串)
更好:制作第一个命令exec
,这将使你的新进程“替换”它产生的shell,然后没有人会知道它是使用shell启动的。
正如@ecatmur的评论所指出的,这是system
电话的确切功能。
但是你正在向潜在的(严重的)问题敞开心扉:你现在必须处理引用和逃避角色。 shell可以(并且将会)解释任何特殊字符,除非它们被转义,并且必须正确引用任何包含空格的参数。
有类似Unix的操作系统以他们的方式处理参数的原因。
我的观点是Windows方法存在根本缺陷。这是一个严重的设计疏忽,阻止您将复杂的字符串作为命令行参数传递给其他程序。