Sans accès à l'argv[0] comment puis-je obtenir le nom du programme?
Je sais que le nom du programme est passé comme premier argument, et à côté simple exemple permettra de l'imprimer sur la sortie standard :
#include <iostream>
int main ( int argc, char *argv[] )
{
std::cout<<argv[0]<<std::endl;
}
Est-il une fonction permettant d'obtenir le nom du programme?
MODIFIER
Je suis en train de créer un programme à partir du shell, et le code ci-dessus va toujours imprimer le nom du programme (je l'utilise fedora 9, mais je suis sûr qu'il fonctionne dans d'autres distributions).
J'ai trouvé que /proc/self/répertoire peut contenir ce que je cherche, mais je ne pouvais pas trouver quoi exactement dans ce répertoire.
Que voulez-vous dire? Vous venez de dire que vous savez que le "nom du programme" est passé comme premier argument...alors quoi d'autre avez-vous besoin?
Coureur Bien la question est assez simple, si vous lisez bien la question, Il dit: "argv[0] est utilisée pour trouver le nom du programme, mais Est-il une autre fonction permettant d'obtenir le nom du programme?". N'En Déplaise : )
il n'y a pas d'infraction, juste de l'incompréhension. la paix 🙂
double possible de comment trouver l'emplacement de l'exécutable en C
La question fait beaucoup de sens à partir d'une bibliothèque de point de vue.
Coureur Bien la question est assez simple, si vous lisez bien la question, Il dit: "argv[0] est utilisée pour trouver le nom du programme, mais Est-il une autre fonction permettant d'obtenir le nom du programme?". N'En Déplaise : )
il n'y a pas d'infraction, juste de l'incompréhension. la paix 🙂
double possible de comment trouver l'emplacement de l'exécutable en C
La question fait beaucoup de sens à partir d'une bibliothèque de point de vue.
OriginalL'auteur BЈовић | 2010-10-27
Vous devez vous connecter pour publier un commentaire.
Non, il n'y a pas une telle fonction. Linux stocke le nom du programme dans
__progname
, mais ce n'est pas une interface publique. Dans le cas où vous souhaitez utiliser pour les avertissements et les messages d'erreur, utilisez laerr(3)
fonctions.Si vous voulez que le chemin d'accès complet du programme en cours d'exécution, appel
readlink
sur/proc/self/exe
:(Je crois
__progname
est défini sur le nom de base deargv[0]
. Découvrez la glibc sources pour être sûr.)Vous ne devriez pas utiliser
__progname
, car il est sans-papiers et pour un usage interne par laerr(3)
fonctions seulement. (Si vous voulez tricher, de la déclarer avecextern const char *__progname;
Mais vraiment, vous ne voulez pas tricher.)/proc/self/cmdline
devrait donner l'ensemble des arguments séparés par un espace transmise à ce programme.OriginalL'auteur Fred Foo
Ce n'est pas garanti.
Généralement,
argv[0]
détient le nom de l'exécutable, mais l'on peut appeler votre exécutable à l'aide deexecve
et le régler pour quelque chose d'autre.En un mot: ne vous fiez pas à cette.
ereOn viens de le souligner quand cela pourrait ne pas être vrai. Donc non, il n'est pas toujours le nom du programme.
Si vous savez écrire votre propre réponse. Si vous ne pensez ensuite aller le chercher ou attendre quelqu'un qui ne sais que répondre. Actuellement, vous sont mauvais (et les folles, les moutons qui vous ont suivi avec droit de vote de votre commentaire).
C'est bien pire que cela. Sur Linux, bash, ce paramètre utilisateur-face : bash -c 'exec - "Le beau nom de programme qui est dans argv[0]" ./exécutable'
York: qui aurait pu être plus doux....Jamais l'esprit.
OriginalL'auteur ereOn
Non, tout dépend de entièrement sur ce que le programme parent met en.
La
exec
famille de fonctions permettent le nom de l'exécutable être totalement différent de l'argument passé, et c'est pris en charge par le C ISO standard.Donc non, c'est seulement le nom du programme si le nom est disponible. Et la section avant que les états:
(mes italiques).
Donc, de même que leurs valeurs ne sont pas dictés par la norme, c'est à la mise en œuvre entièrement. Cela signifie que le nom du programme peut être vide si l'hôte de l'environnement ne fournit pas, et rien d'autre si l'hôte de l'environnement ne leur en fournir.
Cependant, la mise en œuvre définies a un sens précis dans les normes ISO - la mise en œuvre doit document comment il fonctionne. Donc, même UNIX, ce qui peut mettre tout ce qu'il aime dans
argv[0]
avec leexec
de la famille des appels, (et ne) document.De même (grâce à Chubsdad), C++03 unis:
Donc, là encore, argv[0] ne peut contenir n'importe quoi, et, même si elle ne "représente le nom" est très vague et exigence. Il n'a pas à être le chemin complet de l'exécutable ou même de contenir la commande utilisée pour invoquer
Une autre façon de le faire sous Linux est avec le
proc
système de fichiers. Je pense que/proc/self/exe
est un lien vers le fichier exécutable.Wikipedia a une entrée pour le
procfs
système de fichiers avec des tas de goodies.Alors, le comportement peut-être différente pour le C et le C++?
Je ne le pense pas, @Chubsdad: cela semble un peu différent de la norme.
argv[0]
peut représenter le nom du programme ou être vide. Remarquez aussi les mots ambigus "représente le nom de" - ce qui ne doit être le chemin complet de l'exécutable ou même une correspondance partielle. Je suis peut-être cynique, mais la chaîne"A delay program"
serait parfaitement représentatifs de/bin/sleep
🙂Je crois que c'est 100% équivalent à ce que pax cité.
un softlink est permis de pointer vers un fichier supprimé. En fait, il est permis à point à quoi que ce soit. Ils sont beaucoup de ceux dans /proc/*/fd/ qui pointe vers "[socket:1984]" ou "[tuyau:6116]", ce qui n'existe pas du tout dans le système de fichiers.
OriginalL'auteur paxdiablo
Vous pouvez déterminer le pid du processus à l'aide de getpid (), puis inspectez le contenu de /proc/[pid] à l'aide d'e/S standard des outils.
Voir ma réponse. Vous n'avez pas besoin
getpid
.Vous pouvez être en mesure d'obtenir ce dont vous avez besoin en appelant readlink() sur /proc/[pid]/exe ou (encore mieux) /proc/self/exe. Pas sûr à 100%.
/proc/self
est un semi-nom magique pour le processus en cours de /proc entrée. Pas de réel besoin pourgetpid()
. Mais +1 pour recommander /proc.OriginalL'auteur Eugene Smith
GLIBC-solution spécifique:
De
man invocation_name
:OriginalL'auteur Sauron
Si vous utilisez GLib vous pouvez utiliser la fonction
g_get_prgname()
. Sur Win32, il appelleGetModuleFileNameW()
, sur tout le reste, il semble renvoyer NULL.Semble se définie lorsque vous utilisez g_option_context_parse() avec argv[0] pour les plates-formes Win32.
OriginalL'auteur Steve-o