Вызов getFilename изменяет строку, помещая символ '\ 0' после первого токена. Затем вы пытаетесь перезапустить в начале в getArguments. Это дает только первый токен, так как строка теперь преждевременно завершена. Вы можете решить эту проблему, избавившись от getFilename и получив его от getArguments.
char **arguments = getArguments(line);
char *filename = arguments[0];
Кроме того, вы должны выделить место для каждого указателя в массиве char **arguments;
. Вы можете использовать realloc для динамического увеличения массива. Однако есть более эффективные подходы.
char** getArguments(char* input) {
char** arguments;
int k = 0;
char* tokenized;
arguments = calloc(1, sizeof (char *));
tokenized = strtok(input, " &");
/* don't eat the first token here since we want the filename in arguments */
while (tokenized != NULL) {
arguments[k] = tokenized;
++k;
arguments = realloc(arguments, sizeof (char *) * (k + 1));
tokenized = strtok(NULL, " &");
}
/* an extra NULL is required to terminate the array for execvp() */
arguments[k] = NULL;
return arguments;
}