使用CreateProcess尽可能使用单个命令参数调用exec*函数
calling exec* functions with a single command argument as possible with CreateProcess
我已经使用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方法存在根本缺陷。这是一个严重的设计疏忽,阻止您将复杂字符串作为命令行参数传递给其他程序。
相关文章:
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 什么是仅调用一次并调用参数的控制台应用
- 调用参数排列不变函数 f(i++, i++)
- 调用参数不是原子参数的函数是此代码引发异常的原因吗?
- 如何使可调用参数的签名在C++模板中可见?
- x64 函数调用参数推送/移动顺序 (MSVC)
- 如何调用参数由另一个函数生成的函数?
- 从从可调用参数创建的线程对象参数移动构造 C++11 线程
- 正确调用参数化 std::函数
- 是否允许在调用参数中使用类型名 T
- 我不知道如何调用参数为节点类型的函数
- 函数调用参数列表 (C++) 中的空格
- Valgrind 错误:系统调用参数 epoll_pwait(sigmask) 指向不可寻址的字节
- 这C++代码如何让我调用参数数量错误的函数
- 在计算后,在基类之后调用参数化构造函数
- NPAPI调用参数包装
- 在类组合中调用参数化构造函数
- 为什么在创建类对象数组时不能调用参数化构造函数?
- 如何在 for 循环中调用参数化构造函数
- 如何在PIMPL设计模式中调用参数化构造函数