使用CreateProcess尽可能使用单个命令参数调用exec*函数

calling exec* functions with a single command argument as possible with CreateProcess

本文关键字:调用 参数 exec 函数 命令 单个 CreateProcess 尽可能 使用      更新时间:2023-10-16

我已经使用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并启动流程?将命令拆分为一个可执行文件名和参数是可能的,但如果可能的话,我想避免做很多工作。

您可以调用一个shell,并将大字符串传递给shell,让shell处理它

sh -c "echo 'hello world'"

(即传递两个参数,"-c"和包含命令和参数的大字符串)

更好的是:制作第一个命令exec,这将使您的新进程"替换"它生成的shell,然后甚至没有人知道它是使用shell启动的。

正如@ecatmur在评论中指出的,这正是system调用的功能。

但你正在向潜在的(严重的)问题敞开大门:你现在必须处理引用和转义字符的问题。shell可以(并且将)解释任何特殊字符,除非它们被转义,并且任何带有空格的参数都必须正确引用。

类Unix操作系统处理参数的方式是有原因的

我的观点是,Windows方法存在根本缺陷。这是一个严重的设计疏忽,阻止您将复杂字符串作为命令行参数传递给其他程序。