나는 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
문제는 인수가 누락되었다는 것입니다 execlp
. 실행할 명령을 지정한 다음 명령의 이름인 첫 번째 인수를 포함한 모든 인수를 지정해야 합니다.
execlp(parsed[0], parsed[0], parsed[1], parsed[2], parsed[3], parsed[4], (char*) NULL);
첫 번째는 인수 parsed[0]
로 작동 하고 두 번째는 실행된 명령에 최종적으로 나타나는 첫 번째 인수로 작동합니다.execlp
path
arg
argv[0]