I'm doing a command interpreter in C and I have a problem with the execv
function.
I use a method called readCommand
to read a text string and divide it into an array with the command and parameters. Then I pass to the function execv
the array of the form execv(params[0],params)
but it gives me an error.
The thing is that if instead of doing execv
I do system( )
everything is correct. Any suggestions?
I leave the code here:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#define MAX_LENGTH 256
#define DEFAULT_STRING_LENGTH 256
#define MAX_PARAMETERS 16
void initParams(char *** params);
void read_command(char *** params);
void freeParams(char *** params);
void type_prompt();
int comprobarSalir(char cadena[]);
int main(){
int salir = 0;
char ** params;
int i;
do{
type_prompt();
fflush(stdout);
initParams (& params);
read_command (& params);
salir = comprobarSalir(params[0]);
//execv(params [0], params);
if (execv(params [0], params) == -1)
printf("Error al ejecutar el comando'%s':%s\n",params [0], strerror(errno));
freeParams (& params);
}while(salir==0);
return 0;
}
void read_command(char *** args) {
char input [256], *substr;
int n = 0;
fgets(input , sizeof(input), stdin);
input[strlen(input) -1] = '#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#define MAX_LENGTH 256
#define DEFAULT_STRING_LENGTH 256
#define MAX_PARAMETERS 16
void initParams(char *** params);
void read_command(char *** params);
void freeParams(char *** params);
void type_prompt();
int comprobarSalir(char cadena[]);
int main(){
int salir = 0;
char ** params;
int i;
do{
type_prompt();
fflush(stdout);
initParams (& params);
read_command (& params);
salir = comprobarSalir(params[0]);
//execv(params [0], params);
if (execv(params [0], params) == -1)
printf("Error al ejecutar el comando'%s':%s\n",params [0], strerror(errno));
freeParams (& params);
}while(salir==0);
return 0;
}
void read_command(char *** args) {
char input [256], *substr;
int n = 0;
fgets(input , sizeof(input), stdin);
input[strlen(input) -1] = '%pre%';
substr = strtok(input , " ");
if (substr != NULL)
memcpy ((* args)[n], substr , strlen(substr));
else
(*args)[n] = NULL;
n++;
while ((* args)[n-1] != NULL) {
substr = strtok(NULL , " ");
if (substr != NULL)
memcpy ((* args)[n], substr , strlen(substr));
else
(*args)[n] = NULL;
n++;
}
}
void freeParams(char *** params){
int i;
char ** parameter;
for (i=0; i<MAX_PARAMETERS; i++) {
parameter = ((* params) +i);
if (* parameter != NULL) free(* parameter);
}
free(* params);
*params = NULL;
}
void initParams(char *** params) {
int i, j;
char ** parameter;
*params = (char **) malloc(sizeof(parameter) * MAX_PARAMETERS);
for (i = 0; i<MAX_PARAMETERS; i++) {
parameter = (* params) + i;
*parameter = (char*) malloc(DEFAULT_STRING_LENGTH);
for (j = 0; j<DEFAULT_STRING_LENGTH; j++) *((* parameter)+j) = '%pre%';
}
}
void type_prompt(){
char cwd[1024];
getcwd(cwd, sizeof(cwd));
printf("%s$ ",cwd);
}
int comprobarSalir(char cadena[]){
int salir = 0;
if((cadena[0]=='e')&&(cadena[1]=='x')&&(cadena[2]=='i')&&(cadena[3]=='t')){
salir = 1;
}
return salir;
}
';
substr = strtok(input , " ");
if (substr != NULL)
memcpy ((* args)[n], substr , strlen(substr));
else
(*args)[n] = NULL;
n++;
while ((* args)[n-1] != NULL) {
substr = strtok(NULL , " ");
if (substr != NULL)
memcpy ((* args)[n], substr , strlen(substr));
else
(*args)[n] = NULL;
n++;
}
}
void freeParams(char *** params){
int i;
char ** parameter;
for (i=0; i<MAX_PARAMETERS; i++) {
parameter = ((* params) +i);
if (* parameter != NULL) free(* parameter);
}
free(* params);
*params = NULL;
}
void initParams(char *** params) {
int i, j;
char ** parameter;
*params = (char **) malloc(sizeof(parameter) * MAX_PARAMETERS);
for (i = 0; i<MAX_PARAMETERS; i++) {
parameter = (* params) + i;
*parameter = (char*) malloc(DEFAULT_STRING_LENGTH);
for (j = 0; j<DEFAULT_STRING_LENGTH; j++) *((* parameter)+j) = '%pre%';
}
}
void type_prompt(){
char cwd[1024];
getcwd(cwd, sizeof(cwd));
printf("%s$ ",cwd);
}
int comprobarSalir(char cadena[]){
int salir = 0;
if((cadena[0]=='e')&&(cadena[1]=='x')&&(cadena[2]=='i')&&(cadena[3]=='t')){
salir = 1;
}
return salir;
}