我已经使用 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 命令
并启动一个进程?将命令拆分为可执行文件名和参数是可能的,但如果可能的话,我想避免很多工作。
最佳答案
您可以调用一个 shell,将大字符串传递给 shell,让 shell 处理它。自己试试:
sh -c "echo 'hello world'"
(即传递两个参数,“-c
”和包含命令和参数的大字符串)
更好的是:执行第一个命令 exec
,这将使您的新进程“替换”它生成的 shell,然后甚至没有人知道它是使用 shell 启动的。
正如@ecatmur 在评论中指出的那样,这正是 system
的确切功能。打电话。
但是您正在向潜在的(严重的)问题敞开大门:您现在必须处理字符的引用和转义。 shell 可以(并且将会)解释任何特殊字符,除非它们被转义,并且必须正确引用任何包含空格的参数。
类 Unix 操作系统以这种方式处理参数是有原因的。
我的观点是 Windows 方法存在根本性缺陷。这是一个严重的设计疏忽,阻止您将复杂的字符串作为命令行参数传递给其他程序。
关于c++ - 使用 CreateProcess 尽可能使用单个命令参数调用 exec* 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12514434/