%20.png)
Linux で独自のシェルを作成しました。ファイルとコマンドのパスを受け取ります。grep ls などの簡単なコマンドを実行します。execlp() システム コールを使用します。
例: /bin/ls ls < このコマンドは正常に実行されます。
ls < このコマンドは実行されません。
ここで何が間違っているのか知りたいだけです。
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <string.h>
#include <cstring>
#include <sys/types.h>
using namespace std;
int main (int argc, char * argv[])
{
while (true){
char * input;
string insert;
char * token;
char * parsed[5];
int count=0;
cout<<"My Shell $";
getline(cin,insert);
input= new char [insert.size()+1];
strcpy(input, insert.c_str());
for (int i=0; i<5; i++)
parsed[i]=NULL;
token=strtok(input, " ");
while (token!=NULL)
{
parsed[count] = new char[strlen(token) + 1];
strcpy(parsed[count++],token);
token=strtok(NULL, " ");
}
delete input;
delete token;
pid_t mypid=fork();
if (mypid==0)
{
execlp (parsed[0],parsed[1],parsed[2],parsed[3],parsed[4], (char*) NULL);
}
else if (mypid>0)
{
wait(NULL);
}
} //end of while
}
答え1
問題は、 のパラメータが 1 つ足りないことですexeclp
。実行するコマンドを指定し、次にコマンド名である最初の引数を含むすべての引数を指定する必要があります。
execlp(parsed[0], parsed[0], parsed[1], parsed[2], parsed[3], parsed[4], (char*) NULL);
最初のものはのパラメータparsed[0]
として取得され、2 番目は最初の となり、実行されたコマンド内でとして終了します。execlp
path
arg
argv[0]