1

pid型をconstcharポインターに変換して、execlp関数の引数として渡すことができるようにしようとしています。

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

私はあなたがpidを文字列に変換できることを知っています。const std::string my_pid(str_pid.str());

そして、constcharポインタへの文字列。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

すべての値を最初に 1 つに連結し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 に答える