Je dois faire un shell personnalisé comme un projet scolaire et je frappe un mur avec ceci:exec() erreur de retour pour toute commande
int exec_shell(char **argv) //
{
if (execve(argv[0], (char **)argv , NULL)==-1) //if an error occurs
{
printf("Commande invalide : %s\n", argv[0]);
fflush(stdout);//vide le buffer
exit(0);
return -1;
}
return 0;
}
Il est censé être très simple - vous mettre dans un commande sous forme de chaîne et exec appelle la commande. Cependant, il renvoie toujours une erreur.
Qu'est-ce que je fais mal?
Voici le seul avertissement:
primitives.c: 25: 30: avertissement: conversion de dépréciée constante chaîne 'char *' [-Wwrite-strings]
Qu'est-ce que la ligne 25 de votre code? C'est de là que vient l'avertissement. – FKEinternet
Le cast '(char **)' est inutile vu l'argument 'char ** argv'. N'utilisez pas de moules inutiles. Qu'y a-t-il dans 'argv [0]'? Vous n'êtes pas censé passer un pointeur nul en tant qu'argument d'environnement. Les processus ont droit à un environnement minimal - et vous devez passer un pointeur valide vers une liste vide plutôt qu'un pointeur nul ('char * empty [] = {0};' et passer 'empty' à la place de' NULL'). Si vous avez coché 'errno' (ou utilisé perror()' avant d'appeler 'printf()'), vous voudriez voir 'EINVAL' ou' Invalid argument' comme condition d'erreur. En outre, les erreurs doivent normalement être signalées sur 'stderr', pas sur' stdout'. –
Veuillez lire cette spécification pour execve api. https: //linux.die.net/man/2/execve –