1

我正在尝试将 pid 类型转换为 const char 指针,以便可以将它们作为参数传递给 execlp 函数。

例如。execlp("/bin/ps", "-f", "--ppid", "9340,9345,9346,9342");

我知道您可以将 pid 转换为字符串,例如。const std::string my_pid(str_pid.str());

还有一个指向 const char 指针的字符串,例如。my_pid.c_str();

但是如何将多个 pid 连接成一个 const char 指针,以便我可以使用它们运行 execlp 命令?

4

3 回答 3

3

ostringstream可能是你想要的。

例如,

std::ostringstream ostr;
for (int i=0; i<pids.count(); i++)
{
    if (i > 0) ostr << ',';
    ostr << pids[i];
}

execlp("/bin/ps", "-f", "--ppid", ostr.str().c_str());
于 2013-02-27T00:28:09.173 回答
0

字符串将是一种很好的 C++ 方法。

std::stringstream myStream;
myStream << "a c string" << aStringObject << std::endl; // operate on the stream
std::string myNewString = myStream.str(); // create a string object

将数据视为流是一种相当通用的方法,可让您序列化和反序列化自定义或内置类型。自定义类型可以包括operator<<operator>>允许分别插入和提取。

与使用临时字符串对象和操作它们相比,这种方法还应该具有速度优势。stingstream(或其任何基类)将在幕后使用缓冲区。带有临时字符串的循环每次迭代都会调用更多的构造函数/分配/析构函数。这也取决于底层的字符串表示。写入时复制 ( COW ) 字符串实现将具有更少的分配,并且可能只更新一个引用,但更新工作字符串仍然需要一个新字符串。

于 2013-02-27T00:29:02.030 回答
0

您可以将所有值连接在一起std::string,首先将最终std::string值传递给execlp(),例如:

std::string pids;
for (however many pids you have)
{
    if (!pids.empty())
        pids += ",";
    pids += std::string(str_pid.str());
}

execlp("/bin/ps", "-f", "--ppid", pids.c_str());
于 2013-02-27T00:30:31.813 回答