Я пытаюсь выполнить execvp()
, используя собственный **tokens
двойной указатель в качестве ввода вместо argv[]
в назначении "создать собственную оболочку", например:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
int main(){
char *token;
char **tokens = malloc(sizeof(char*)*512); //512 is for the maximum input-command length
char *command=malloc(sizeof(char)*512);
int i = 0;
pid_t child_pid;
int status;
//***********take input from user*************************************
fgets(command,512,stdin);
//***********parse input*********************************************
token = strtok(command," \t");
while( token != NULL ) {
tokens[i]=token;
i ++;
token = strtok(NULL, " \t");
}
child_pid = fork();
if(child_pid == 0) {
/* This is done by the child process. */
execvp(tokens[0], tokens);
} else {
waitpid(child_pid, &status, WUNTRACED);
}
}
Проблема определенно в этой строке:
execvp(tokens[0], tokens);
и я просто не могу понять, почему его нельзя выполнить и распечатать на моем stdout
.
Я пробовал это:
execvp("ls", tokens);
и все работает просто отлично.
И это:
printf("%s\n", tokens[0]);
с выходным значением (в соответствии с тестовым входом: ls
):
Ls