Прочитайте документацию от execv(3) и от execve(2) и от perror(3). По крайней мере, вы должны кодировать
int main(int argc, char *argv[]) {
char *loc = getL();
char *args[] = { loc, "ls", NULL };
int i;
execv(args[0], args);
perror("execv");
free(loc);
}
Вы должны компилировать с gcc -Wall -g
затем использовать gdb
отладчик.
Ваше использование execv
, очевидно, неверно (вам нужен полный путь, например "/bin/ls"
, а порядок аргументов неправильный). Вы, вероятно, хотите exevcp(3), и вы должны на самом деле код, по крайней мере:
char *args = { "ls", loc, NULL };
execvp("ls", args);
perror("execvp")
Если вы настаиваете на использовании специально execv(3) вы могли бы попробовать
char *args = { "ls", loc, NULL };
execv("/bin/ls", args);
perror("execv")
Я не понимаю, что ваш код должен делать. Вас может заинтересовать glob(7) & glob(3).
Вы, вероятно, следует читать Advanced Linux Programming. Кажется, есть несколько понятий, которые вы недостаточно хорошо понимаете. Я думаю, что strace(1) может быть вам полезен (по крайней мере, запустив strace ls *.c
, чтобы понять, что происходит).
Возможно, ваш getL
- это именно то, что делает функция GNU get_current_dir_name(3), но в этом случае (char**)
литье внутри. И вы должны лучше очистить буфер buff
используя memset(3) перед вызовом getcwd(2) (и вы должны проверить на провал таНос and of
getcwd`)
Может быть, вы хотите opendir(3), readdir(3), asprintf(3), stat(2); со всем этим, можно даже избежать запуска ls
Если вы кодирование некоторой оболочки, вы должны strace
некоторых существующие оболочек, и, прочитав все ссылки я даю здесь, изучать исходный код free software оболочек как sash и GNU bash
Во-первых, проверьте ERRNO по возвращению из 'execv'. Затем проверьте параметры, которые вы передаете. – Duck
Возврат execv -1 – Roni
Конечно, он возвращает -1. Используйте 'errno' и' strerror' или 'perror', чтобы объяснить, почему ... а именно ваши параметры. – Duck