私はここで本当に迷っています。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;
}
}