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

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

最佳答案

您可以调用一个 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/

相关文章:

C++ + SDL + OpenGL 3.3 不能在 Mac OS X 上运行?

sql-server - 如何执行长动态查询(大于 4000)字符 - 再次

c - 使用 C 中的结构将数据传递给 Pthread

c - 为什么 POSIX 与 ISO C 标准相矛盾

c++ - move std::vector 时是否需要保留容量?

c++ - 卡尔曼滤波器库

c++ - C++ 中复杂变量的 OpenMP 减少的优雅(和典型)解决方法?

c - 如何像使用 execl 的 bash 一样使用 Ctrl+D 退出?

php - ffmpeg 使用 exec() 输出必须是实时的

c++ - 线程 : Segmentation fault error