2008-11-30 8 views
3

La fonction execvp() exécute le programme qui est donné en argument. Il vérifie la variable $ PATH pour trouver le programme. J'écris quelque chose dans lequel je voudrais vérifier si plusieurs programmes existent avant d'appeler des fonctions exec(). Quelle est la meilleure façon de faire cela?

+1

Vous ne devriez probablement pas compter uniquement sur l'existence - vous avez besoin du fichier d'avoir des autorisations d'exécution (pour vous) aussi. Même ce n'est pas infaillible; Si le programme démarre #!/bin/inexistant, il ne s'exécutera pas car le programme n'existe pas. C'est pourquoi execlp() essaye juste chaque nom à son tour, je crois. –

Répondre

7

Vous pouvez utiliser getenv pour obtenir la variable d'environnement PATH, puis la parcourir.

http://www.opengroup.org/onlinepubs/000095399/functions/getenv.html

Vous pouvez ensuite utiliser fopen pour vérifier l'existence des noms binaires spécifiques.

Vous pouvez également faire quelque chose comme système ("quelle application"). qui recherche $ PATH pour vous.

http://en.wikipedia.org/wiki/System_(C_standard_library)

http://en.wikipedia.org/wiki/Which_(Unix)

+0

+1 pour suggérer «qui». Corrigez vos liens Wikipedia, aussi. – strager

+0

Correction des liens :) – grepsedawk

2

la commande qui est probablement ce que vous voulez.

+0

Cela a été mentionné dans la réponse de @ grepsedawk.myopenid.com. – strager

3

L'execvp de glibc et de netbsd essaie en fait d'exécuter la commande pour chaque élément le long du chemin jusqu'à ce qu'il réussisse ou qu'il manque de chemin pour rechercher. Ne laisse pas beaucoup de place pour la réutilisation, mais semble bon.

En général, pour des questions comme celle-ci, j'aime aller à la source et voir ce qu'il fait. NetBSD c'est généralement la meilleure lecture:

+0

Le code est en fait sur execvp, pas sur execlp (le lien NetBSD pointait déjà vers execvp); J'ai édité votre réponse pour être ce que vous avez probablement prévu (n'hésitez pas à revenir si je me suis trompé). – CesarB

+0

@CesarB Merci pour le nettoyage après moi. :) – Dustin

0

Une fois que vous avez un chemin absolu (canonisé), vous pouvez utiliser stat (2) ou accès (2) pour voir si le fichier existe.

Avec stat:

struct stat st; 
if (stat(path, &st)) { 
    // path doesn't exist 
} 

Avec un accès:

if (access(path, F_OK)) { 
    // path doesn't exist 
} 
Questions connexes