Вам не нужно проходить полный код с самого начала. Проблема в выражении execl (..) внутри main. Код —
#include <cstdio>
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/wait.h>
#include <vector>
#define li long int
using namespace std;char TypedCommandInTerminal[1001];
vector <string> ValidCommands,TypedCommand;void ShowTerminal()
{
cout<<"User:$ ";
gets(TypedCommandInTerminal);
}void PushCommands()
{
ValidCommands.push_back("mkdir");
}void GetCommandIntoVector()
{
TypedCommand.clear();
char *p = strtok(TypedCommandInTerminal," ");
while(p)
{
TypedCommand.push_back(p);
p = strtok(NULL," ");
}
}
bool MatchCommand(string Command)
{
li i;
for(i=0;i<ValidCommands.size();i++)
{
if(ValidCommands[i].compare(Command)==0)
{
return true;
}
}
return false;
}int main()
{
int status;
string StoredCommand;
PushCommands();
while(true)
{
ShowTerminal();
if(fork()!=0)
{
waitpid(-1,&status,0);
}
else
{
GetCommandIntoVector();
if(MatchCommand(TypedCommand[0]))
{
StoredCommand = "mkdir";
if(StoredCommand.compare(TypedCommand[0])==0)
{
execl("/bin/mkdir","mkdir",TypedCommand[1],NULL);/*ERROR*/
}
}
else
{
cout<<"Command Not Available\n";
return -1;
}
}
}
return 0;
}
Я пытаюсь разработать простой терминал с использованием C ++ в Linux. То, что я пытаюсь сделать здесь, — взять эту команду в консоли в качестве ввода — «mkdir ab». Затем мне удалось маркировать эту строку и сохранить «mkdir» в TypedCommand [0] и «ab» в TypedCommand [1]. Проблема в том, что когда я пишу «TypedCommand [1]» внутри execl, компилятор выдает ошибку — «не может передать объекты нетривиально копируемого типа …..» Я удалил TypedCommand [1] и вручную написал «ab» на месте этого Код запустился и создал папку с именем «ab» в каталоге выполнения. Похоже, execl работает нормально.
Мне нужно как-то передать вторую строку, сохраненную в TypedCommand [1] внутри execl … что здесь не так?
Вы передаете std::string
объект в качестве необязательного аргумента функции (execl
принимает переменное количество аргументов). std::string
имеет нетривиальные конструкторы, деструкторы и т. д. и не может использоваться таким образом. В этом случае вы хотите передать указатель на строку, так что измените
execl("/bin/mkdir","mkdir",TypedCommand[1],NULL);
в
execl("/bin/mkdir","mkdir",TypedCommand[1].c_str(),NULL);