antonpuz
antonpuz

Reputation: 3316

find name of the execute file from withing the program

I am looking for a way to find the name of the executable file which runs it. meaning that if I have a file called program which runs something I would like to get its name.

Using __FILE__ does not suite me since I need the executable name not the C files name which contains the code.

I am wondering if there is a gcc macro which can help me or a built in function which I couldn't find.

EDIT: Also using argv[0] is not appropriate since I need to call the function not only inside main.

And passing the argv[0] parameter to all the functions that might need this parameter also isnt acceptable since it will be used in the entire system (I need to hash by it).

Upvotes: 0

Views: 137

Answers (5)

alk
alk

Reputation: 70931

The startup name is given via main()'s argv[0] and can be considered constant.

So why not make it available through out the program using a global reference to it.

progname.h

#ifndef PROGNAME_H
#define PROGNAME_H

extern char * progname;

#endif

main.c

#include "progname.h"

char * progname = NULL;

int main(int argc, char ** argv)
{
  progname = argv[0];

  ...

}

Access it from any where like so

module1.c

#include <stdio.h>
#include "progname.h"

void f(void)
{
  printf("progname='%s'\n", progname ?progname :"<not set>");
}

Upvotes: 0

Emil Laine
Emil Laine

Reputation: 42828

From main, pass argv[0] to wherever you might need the program's name.

Or if a lot of functions need it and you want to avoid passing it around too much, assign it to a global variable.

You asked for macros as a solution, but they are expanded at compile time. And since the name of the executable file can be changed after compilation, what you want cannot be determined at compile time, so macros are out of question.

Upvotes: 2

Wintermute
Wintermute

Reputation: 44023

Often remembering argv[0] from main will be quite sufficient.

If this is not the case -- for example if you're a shared library, or if you worry that your caller started you with a faked argv[0] (this is possible but unusual), you can, on POSIX-compliant systems with a mounted /proc, use readlink to resolve /proc/self/exe and get a path to the main binary of the running process:

#include <limits.h>
#include <unistd.h>

// Note that readlink does not null-terminate the result itself. This
// is important if the link target contains null bytes itself, I suppose,
// but it means that you have to take care that the null-terminator is
// placed yourself if you're going to use the file name as a string.
char buf[PATH_MAX] = { 0 };
readlink("/proc/self/exe", buf, PATH_MAX);

And on Windows, there is the GetModuleFileName function:

#include <windows.h>

TCHAR buf[MAX_PATH];
GetModuleFileName(NULL, buf, MAX_PATH);

Upvotes: 1

David Hoelzer
David Hoelzer

Reputation: 16331

The standard definition for main() in C is:

int main(int argc, char **argv)

argv[0] contains the name of the program as executed.

Upvotes: 2

Spikatrix
Spikatrix

Reputation: 20244

int main(int argc,char* argv[])
{
    printf("%s",argv[0]);
    return 0;
}

The first argument(argv[0]) contains the name of the program which is being run.

Upvotes: 3

Related Questions