Я пытаюсь реализовать оболочку. Я создам массив истории для хранения последних 10 команд, которые я хочу получить позже для выполнения. Итак, я пытаюсь найти способ вернуть все аргументы командной строки, как только я сохраню их в этом массиве истории.
Предоставляется часть кода, gettoks() — это функция для получения и разбора командной строки ввода. Функция gettoks() возвращает массив указателей на строки символов. Каждая строка представляет собой либо слово, содержащее буквы, цифры, . и /, либо строку из одного символа, содержащую один из специальных символов: ( ) ‹ > | & ;
Я понимаю, что я могу передать toks в execvp, чтобы выполнить команду сразу после ее выполнения, но как только она будет сохранена в массиве строк 2d, как я смогу ее получить?
Я также понимаю, что указатели и массивы могут облегчить мне жизнь, но я еще не так хорошо знаком с ними! Итак, мне было интересно, могу ли я получить отзыв о коде и решить ошибку компиляции в строке «execvp(c[0], c);».
"ошибка: неверное преобразование из 'char' в 'const char*' ошибка: невозможно преобразовать 'const char*' в 'char* const*' для аргумента '2' в 'int execvp (const char*, char* const*) '"
Спасибо.
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <cstdlib>
#include <stdio.h>
using namespace std;
extern "C"
{
extern char **gettoks();
}
int main( int argc, char *argv[] )
{
// local variables
int ii;
char **toks;
int retval;
string tokenString;
string hist[11][2];
// initialize local variables
ii = 0;
toks = NULL;
retval = 0;
tokenString = "";
int m = 0; // command counter
for(int i = 0; i < 11; i++){ // initialize the hist array
for (int j = 0; j <2; j++){
hist[i][j]= "";
}
}
// main (infinite) loop
while( true )
{
// get arguments
toks = gettoks();
if( toks[0] != NULL ){ // if a command is entered
if ( m < 10){
m++; // increment the number of commands
for( ii=0; toks[ii] != NULL; ii++ ){ // add the command to the hist array
tokenString += toks[ii];
}
hist[m][0] = toks[0];
hist[m][1] = tokenString;
}
else if (m == 10){ // if the hist array is full
for( int k = 1; k < 10; k++ ){ // shift the commands in the hist array
for (int l = 0; l < 2; l++){
hist[k][l] = hist[k+1][l];
}
}
for( ii= 0; toks[ii] != NULL; ii++ ){ // add the new command to the hist array
tokenString += toks[ii];
}
hist[10][0] = toks[0];
hist[m][1] = tokenString;
}
}
for(int i = 1; i < 11; i++){// print the hist array
for (int j = 0; j <2; j++){
cout << hist[i][j] << "\t";
}
cout << endl;
}
tokenString = ""; // reset
const char * c = hist[1][1].c_str();
execvp(c[0] , c);
if( !strcmp( toks[0], "exit" ))
break;
}
// return to calling environment
return( retval );
}