1

私はここで本当に迷っています。Linux シェルを構築し、外部コマンドの処理に取り組んでいます。新しいプロセスを作成してコマンドを実行しようとしています。exec()、fork()、pipe()、および dup() は非常に新しいですが、どこかでそれらが必要になると確信しています。

基本的に私の質問は次のとおりです。引数をexecに渡す最良の方法は何ですか? 多くのオプションがあることは知っていますが、「ls -l」を含む文字列ベクトルがある場合、それを実行に渡すにはどうすればよいですか? 「ls」と「-l」に再解析する必要がありますか?

すでに fork() で子プロセスを作成していますが、exec() の実行方法がわかりません。

少し関連するメモとして、fork() の waitpid 部分には何を入れればよいでしょうか。

                pid_t pid;
                int status;
                pid = fork();
                if (pid < 0)
                {
                    cout << "Fork failed." << endl;
                }
                else if (pid == 0)
                {

                    execv("/bin/sh", (VECTOR OF COMMANDS?));
                    _exit (EXIT_FAILURE);
                }
                else
                {
                    if (waitpid (pid, &status, 0) == pid)
                    {
                        cout << "huh?" << endl;
                    }
                    else
                    {
                        cout << "Error." << endl;
                    }
                }

次のハードルは配管ですが、そこに着いたらその橋を渡ります。

編集:

価値があるのは、これが私が問題を抱えている解析と呼び出しです。後に「 * *」が付いている行は、私に問題を引き起こしているようです

    const char *args [1024];

string::iterator it5;
size_t pos5;

for (it5=origCstr.begin(); it5 < origCstr.end(); it5++)
{
    string::iterator it2;
    pos5 = origCstr.find(' ');
    if (pos5 == string::npos)
    {
        tmpChar = origCstr.c_str();
        args[argCount] = tmpChar;
        argCount++;
        break;
    }
    it2 = it5 + pos5;
        tmpCstr = origCstr.substr(0, pos5);
    tmpChar = tmpCstr.c_str();
    args[argCount] = tmpChar;
    origCstr.erase(it5, it2+1);
    argCount++;
}
    tmpChar = origCstr.c_str();
args[argCount] = tmpChar;
argCount++;

    pid_t pid;
int status;
pid = fork();
if (pid < 0)
{
    cout << "Fork failed." << endl;
}
else if (pid == 0)
{

        execv("/bin/", args); ****
        _exit (EXIT_FAILURE);
}
else
{
    if (waitpid (pid, &status, 0) == pid)
    {
        cout << "huh?" << endl;
    }
    else
    {
        cout << "Error." << endl;
    }
}
4

1 に答える 1

1

オプションを含むを作成できるように、「execv」を呼び出す必要がchar*[]あります。"ls" と "-l" はそれぞれ、配列内に独自のスロットを取得します。

const をキャストするか、char `char const*[]' 配列を使用してからその const をキャストして execv に渡す必要があります。一般に、これらのシステム コールの宣言は、C++ にはやや不向きです。

この件に関するスタック オーバーフローの質問を参照してください。

http://www.yolinux.com/TUTORIALS/ForkExecProcesses.htmlに妥当なチュートリアルがあります。

大ざっぱに言えば:

char * exec_args[1024];
int arg_count = 0;
std::vector<std::string> theArgs;

exec_args[arg_count++] = "/bin/whatever"; // leave command in argv[0]
for (int x = 0; x < theArgs.size(); x++) {
   exec_args[arg_count++] = strdup(theArgs[x].c_str());
}
exec_args[arg_count++] = 0; // tell it when to stop!

execv("/bin/whatever", exec_args);
于 2012-06-03T02:56:24.223 に答える