2

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

4

1 回答 1

1

您可以调用一个外壳,并将大字符串传递给外壳,让外壳处理它。自己试试:

sh -c "echo 'hello world'"

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

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

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

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

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

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

于 2012-09-20T14:12:30.640 回答