В настоящее время я борюсь с этой ошибкой. Я пишу эмулятор оболочки, используя fork() для выполнения команды с помощью execvp();. Почти каждая команда, которую я пытаюсь проанализировать в своей оболочке, работает отлично, за исключением ls без аргументов. Если я попытаюсь выполнить ls -lah, все работает, но простой ls не будет, получая следующую ошибку:
ls: fts_open: No such file or directory
Вот фрагмент моего кода: (только самое необходимое)
pid = fork();
if (pid==0)
{
puts("CHILD");
puts(args[0]);
puts(args[1]);
printf("%d\n", strlen(args[1]));
args[2] = NULL;
execvp(args[0], args);
}
else wait(NULL);
puts("BACK TO PARENT");
}
и вот вывод для ls:
ls
CHILD
ls
0
ls: fts_open: No such file or directory
BACK TO PARENT
как видите, args[0] содержит ls, args[1] пуст, так как аргументов нет, длина args[1] равна 0, но я продолжаю получать ошибку.
Любая идея о том, что это может быть?
РЕДАКТИРОВАТЬ:
Престижность Джонатану Леффлеру за то, что он это обнаружил: (также кажется, что это просто проблема на Mac)
Дело в том, что args[1] на самом деле не пуст, поэтому ОС пытается открыть файл '', которого, очевидно, не существует, и, судя по всему, создать его нельзя, так как он не действительно имя.
Итак, вот что я сделал: проверил длину args[1]. Если это 0, установите его в NULL. (просто освобождение памяти не очень помогло)
pid = fork();
if (pid==0)
{
puts("CHILD");
puts(args[0]);
puts(args[1]);
if (strlen(args[1]) == 0)
args[1] = 0;
args[2] = NULL;
execvp(args[0], args);
}
else wait(NULL);
puts("BACK TO PARENT");
}
args
(что установлено вargs[1]
, что пусто?), а также больше вашего кода? - person Jorge Israel Peña   schedule 09.04.2013