2 votes

passage de paramètres dynamiques à 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 paramètres pendant l'exécution et les passer à execlp() . J'utilise un tableau 2d de longueur fixe m[][] de manière à ce que tout emplacement inutilisé (restant) puisse être transmis en tant que NULL a execlp (dans ce cas m[2][] ).

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>

int main() {
    char m[3][5], name[25];
    int i;
    strcpy(name, "ls");
    strcpy(m[0], "-t");
    strcpy(m[1], "-l");
    //To make a string appear as NULL (not just as an empty string)
    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 faire ?

3voto

Jonathan Leffler Points 299946

Puisque vous souhaitez accepter un nombre quelconque d'arguments, vous devriez essayer d'utiliser la méthode suivante execvp() au lieu de execlp() :

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

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);
}

Le execvp() prend une liste d'arguments de longueur arbitraire sous la forme d'un tableau, contrairement à la fonction execlp() où chaque appel que vous écrivez ne prend qu'une liste d'arguments de longueur fixe. Si vous souhaitez prendre en compte 2, 3, 4, ... arguments, vous devez écrire des appels distincts pour chaque nombre différent d'arguments. Toute autre solution n'est pas totalement fiable.

1voto

wildplasser Points 17900
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

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

Par souci de simplicité, j'ai remplacé tous les éléments de gestion des chaînes par un tableau de pointeurs fixes. Il n'y a qu'un dernier argument NULL nécessaire pour execlp(), execle() aurait également besoin du pointeur d'environnement après l'argument NULL.

0voto

rajesh6115 Points 556
 char m[3][5];

Il s'agit d'un tableau de caractères en 2D.

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

Il s'agit donc toujours d'une adresse constante, qui ne peut jamais être NULL, car il s'agit d'une adresse constante qui ne peut pas être NULL, et qui ne peut pas non plus être assignée à NULL, ce qui oblige à 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. Le dernier élément de l'argument char *argv[] peut être utilisé comme argument de fin dans la fonction execlp().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X