paramètre dynamic passant à la fonction execlp () en C

Pour simplifier les choses, j’ai modifié mon programme. Ce que je veux faire, c’est accepter n’importe quel nombre de parameters pendant l’exécution et le transmettre à execlp() . J’utilise un tableau 2d de longueur fixe m[][] telle sorte que tous les execlp inutilisés (restants) execlp être passés en tant que NULL à execlp (dans ce cas, m[2][] ).

 #include #include #include #include int main() { char m[3][5], name[25]; int i; strcpy(name, "ls"); strcpy(m[0], "-t"); strcpy(m[1], "-l"); //To make a ssortingng appear as NULL (not just as an empty ssortingng) for(i = 0; i < 5; i++) m[2][i] = '\0'; // or m[2][i] = 0 (I've tried both) execlp(name, m[0], m[1], m[2], '\0', 0, NULL); // Does not execute because m[2] is not recognized as NULL return 0; } 

Comment fait-on ça?

Puisque vous voulez accepter n’importe quel nombre d’arguments, vous devez utiliser execvp() au lieu de execlp() :

 #include  #include  #include  #include  #include  int main(void) { char *argv[] = { "ls", "-l", "-t", 0 }; execvp(argv[0], argv); fprintf(stderr, "Failed to execvp() '%s' (%d: %s)\n", argv[0], errno, strerror(errno)); return(EXIT_FAILURE); } 

La fonction execvp() prend une liste d’arguments de longueur arbitraire sous la forme d’un tableau, contrairement à execlp() où tout appel unique écrit ne prend qu’une liste d’arguments de longueur fixe. Si vous souhaitez gérer 2, 3, 4, … arguments, vous devez écrire des appels séparés pour chaque nombre différent d’arguments. Tout le rest n’est pas totalement fiable.

 #include  #include  #include  #include  int main() { char *args[] = {"ls", "-t", "-l" }; execlp(args[0], args[0], args[1], args[2], NULL); perror( "execlp()" ); return 0; } 

Pour plus de simplicité, j’ai remplacé tout le matériel de gestion des chaînes de caractères par un tableau de pointeurs fixe. Un seul argument final NULL est nécessaire pour execlp (). Execle () aurait également besoin du pointeur d’environnement après l’argument NULL.

  char m[3][5]; 

Ceci est un tableau 2D de caractères.

 m[2] is a element of the 2D array that is it it a 1D Array of characters. 

Ainsi, il doit toujours avoir une adresse constante. Et il ne doit jamais être NULL, car il s’agit d’une adresse constante qui ne peut pas être NULL. Encore une fois, il ne peut pas être affecté à NULL, vous devez donc utiliser NULL comme dernier paramètre.

execlp () utilise NULL comme argument final, vous devez donc le mentionner.

Si vous utilisez un argument de ligne de commande, le dernier argument de ligne de commande est toujours NULL.SO, le dernier élément de l’argument char * argv [] peut être utilisé comme argument final dans la fonction execlp ().