Come arrivare attuale nome del processo in linux?

Come posso ottenere il nome del processo in C? Lo stesso nome, che è in /proc/$pid/status. Non voglio analizzare il file. C’è qualche modo programmatico di fare questo?

InformationsquelleAutor Mariusz | 2012-02-01

 

7 Replies
  1. 24

    Sia che punta il argv[0] o, infatti, si può leggere /proc/self/status. Oppure è possibile utilizzare getenv("_"), non sono sicuro che i set e di come affidabile è.

    • Nota che getenv("_") sembra restituire il processo iniziato dalla shell — se io la chiamo in un processo iniziato da make, vedo “/usr/bin/fare”, piuttosto che il mio nome del processo. Questo significa che probabilmente è impostato dalla shell.
    • buona osservazione, infatti.
  2. 35

    Se si sta utilizzando un glibc, quindi:

    #define _GNU_SOURCE
    #include <errno.h>
    
    extern char *program_invocation_name;
    extern char *program_invocation_short_name;

    Vedere program_invocation_name(3)

    Nella maggior parte dei sistemi Unix, __progname è definito anche dalla libc.
    L’unico portatile modo è quello di utilizzare argv[0]

  3. 15

    È possibile utilizzare __progname. Tuttavia, non è meglio di argv[0] come si possono avere problemi di portabilità. Ma come non si dispone di accesso a argv[0] può lavorare come segue:-

    extern char *__progname;
    printf("\n%s", __progname);
  4. 5

    Guardare il valore di argv[0] che è stato passato al main. Questo dovrebbe essere il nome con il quale il processo è stato richiamato.

    • Purtroppo in questo caso non ho accesso a argv[0]
    • Poi si sta andando ad avere per passare attraverso proc – anche se ti consiglio /proc/self/cmdline.
    • Puoi anche provare getenv("_") anche se non so quanto affidabile è.
  5. 5

    Mi capita spesso di fare uso del seguente chiamata,

    char* currentprocname = getprogname();
    • Che BSD-specifici. Si può ottenere su Linux con libbsd, ma non è parte della libc in quanto è su FreeBSD o OS X.
  6. 1

    Se non è possibile accedere argv[] in main(), perché implementazione di una libreria, puoi dare un’occhiata alla mia risposta su una domanda simile qui.

    Esso si riduce sostanzialmente a dare accesso a argc, argv[] e envp[] al di fuori del main().
    Poi si potrebbe, come altri hanno già correttamente suggerito, utilizzare argv[0] per recuperare il nome del processo.

    • oppure si potrebbe guardare in /proc/self/cmdline
  7. 0

    Questa è una versione che funziona su macOS, FreeBSD e Linux.

    #if defined(__APPLE__) || defined(__FreeBSD__)
    const char * appname = getprogname();
    #elif defined(_GNU_SOURCE)
    const char * appname = program_invocation_name;
    #else
    const char * appname = "?";
    #endif

Lascia un commento