execvp - ls: fts_open: Nenhum arquivo ou diretório
Atualmente estou lutando com esse erro. Eu estou escrevendo um emulador de shell, usando fork () para executar um comando usando execvp ();. Quase todos os comandos que tento analisar na minha shell estão funcionando perfeitamente, exceto por ls sem argumentos. Se eu tentar executar ls -lah, tudo funciona, mas um simples ls não, recebendo o seguinte erro:
ls: fts_open: No such file or directory
Aqui está um trecho do meu código: (apenas o essencial)
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");
}
e aqui está a saída para ls:
ls
CHILD
ls
0
ls: fts_open: No such file or directory
BACK TO PARENT
como você pode ver, args [0] contém ls, args [1] está vazio, como não há argumentos, o comprimento de args [1] é 0, mas eu continuo recebendo o erro.
Alguma ideia do que poderia ser?
EDITAR:
Kudos para Jonathan Leffler por descobrir: (também, parece que é apenas um problema no Mac)
O ponto é que args [1] não é realmente vazio, então, o sistema operacional tenta abrir o arquivo '', que, obviamente, não existe e, pelo que é aparência, não pode ser criado, pois não é realmente um nome.
Então, aqui está o que eu fiz: verifique o len de args [1]. Se for 0, defina como NULL. (apenas liberar a memória não ajudou muito)
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");
}