使用CreateProcess,使用单个命令参数调用exec *函数

时间:2012-09-20 14:08:27

标签: c++ exec posix

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

1 个答案:

答案 0 :(得分:1)

你可以调用一个shell,并将大字符串传递给shell,然后让shell处理它。亲自尝试一下:

sh -c "echo 'hello world'"

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

更好:制作第一个命令exec,这将使你的新进程“替换”它产生的shell,然后没有人会知道它是使用shell启动的。

正如@ecatmur的评论所指出的,这是system电话的确切功能。

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

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

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