#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
char** get_env(void){
char *ptr, *ch, *next_ptr;
char **tok = malloc(sizeof(char*) * 20);
int i = 0;
ch = getenv("PATH");
for(i=0, ptr=ch; ;ptr=NULL,i++){
tok[i] = strtok_r(ptr, ":", &next_ptr);
if(tok[i] == NULL) break;
}
tok[i] = NULL;
return tok;
}
char **get_input(char *input){
char **command = malloc(8 * sizeof(char *));
char *separator = " ";
char *parsed, *nextptr;
int index = 0;
parsed = strtok_r(input, separator, &nextptr);
while(parsed != NULL){
command[index] = parsed;
index++;
parsed = strtok_r(NULL, separator, &nextptr);
}
command[index] = NULL;
return command;
}
int main(void) {
char **env = get_env();
pid_t pid;
int stat_loc;
while(1) {
int i = 0;
char *nextptr, *parsed;
char *command[20];
char* input = malloc(sizeof(char)*20);
printf("$>");
input = fgets(input,19,stdin);
input[strlen(input) - 1] = '\0';
if(strcmp("exit",input) == 0) {
free(input);
break;
}
parsed = strtok_r(input, " ",&nextptr);
while(parsed) {
command[i] = parsed;
printf("%s \n", command[i]);
i++;
parsed = strtok_r(NULL, " ", &nextptr);
}
command[i] = NULL;
pid = fork();
if(pid == 0){
if(execvp(command[0], command) == -1) {
printf("FAILED \n");
exit(0);
}
}
if(pid > 0){
wait(&stat_loc);
}
free(input);
}
free(env);
return 0;
}
Я пытаюсь написать простую linux программу оболочки на C. Используется функция execvp
.
, когда command[0](char *)
и command(char * [])
введены в execvp
, возвращаемое значение составляет только -1
, в нем не отображается запущенная программа, такая как pwd
, ls
.
Я искал несколько блогов и руководств в сети, но не могу найти, как решить эту ошибку. Как сделать так, чтобы функция execvp работала?
--- отредактировано ---
при вводе переменной ls -a
в char* input
, функция strtok_r
делит строку на массив указателей ( char * command[]
), и команда (command[0]
) и аргумент (command
) введены execvp
функция.
я хочу выполнить соответствующую программу, такую как cd
, pwd
, ls
. Но я не вижу работающей программы, отображается только «СБОЙ».