Linux C语言获取当前程序名称的三种方式

嵌入式技术

1372人已加入

描述

1. 前言

如果需要在程序内部获取当前运行程序的名称,可以使用如下 4 种方式:

  1. argv[0]
  2. /proc/self/comm/proc/self/cmdline
  3. __progname
  4. readlink("/proc/self/exe")

下面说一下这几种方式适用的场景。

2. 适用场景

2.1 仅获取程序名称

如果仅仅想得到可执行程序的名称,不需要目录信息,可以使用 __progname/proc/self/comm

//__progname
extern char *__progname;
printf("program name:%sn", __progname);

// /proc/slef/comm
char filename[64] = {0};
int fd = -1;
fd = open("/proc/self/comm", O_RDONLY);
read(fd, filename, sizeof(filename));
printf("program name:%sn", filename);

2.2 获取终端输入

如果想得到程序执行时在 终端输入的命令行 ,可以使用 argv[0]/proc/self/cmdline

//argv[0]
printf("terminal input:%sn", argv[0]);

// /proc/self/cmdline
char filename[128] = {0};
int fd = -1;
fd = open("/proc/self/cmdline", O_RDONLY);
read(fd, filename, sizeof(filename));
printf("terminal input:%sn", filename);

2.3 获取程序绝对路径

如果想得到可执行程序所在的具体位置,那么就使用 /proc/self/exe。而且,即使在终端运行的是可执行程序的 软链接/proc/self/exe 返回的也是可执行程序自身的位置。

// /proc/self/exe
char filename[128] = {0};
readlink("/proc/self/exe", filename, sizeof(filename));
printf("program absolute position:%sn", filename);

3. 源码

main.c:

#include < stdio.h >
#include < stdlib.h >
#include < stdint.h >
#include < string.h >
#include < sys/types.h >
#include < sys/stat.h >
#include < fcntl.h >
#include < unistd.h >

extern char *__progname;

static void file_content_read(const char *filename, char *buf, uint32_t buf_size)
{
    int32_t fd = -1;

    fd = open(filename, O_RDONLY);
    if(-1 == fd)
    {
        printf("open %s failedn", filename);
        return;
    }

    read(fd, buf, buf_size);
}


int main(int argc, char *argv[])
{
    char file_info[64] = {0};

    printf("program name:%sn", __progname);

    memset(file_info, 0, sizeof(file_info));
    file_content_read("/proc/self/comm", file_info, sizeof(file_info));
    printf("program name:%sn", file_info);


    printf("terminal input:%sn", argv[0]);

    memset(file_info, 0, sizeof(file_info));
    file_content_read("/proc/self/cmdline", file_info, sizeof(file_info));
    printf("terminal input:%sn", file_info);


    memset(file_info, 0, sizeof(file_info));
    readlink("/proc/self/exe", file_info, sizeof(file_info));
    printf("program absolute position:%sn", file_info);

    return 0;
}

编译:

gcc main.c -o proc-name

新建链接文件:

ln -s proc-name sy-proc-name

4. 运行结果

4.1 运行程序本身

Linux

4.2 运行链接程序

Linux

5. 总结

多数情况下只需获取程序的名称,__progname,足矣。

tips

得到程序的名称有什么用呢?

可以根据程序中获取到的程序名称的不同执行不同的功能 ,大名鼎鼎的 busybox 就是这么干的!其原理就是针对可执行程序创建不同名称的链接文件,链接文件执行时在程序中可以得到链接文件的名称,以此名称为判断条件执行不同的功能。

busybox

busybox --help

Linux

Linux

自实现

main.c

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

extern char *__progname;

int main(int argc, char *argv[])
{
    char file_info[64] = {0};

    printf("program name:%sn", __progname);

    if(0 == strcmp(__progname, "self-ping"))
    {
        printf("this is self ping commandn");
    }
    else if(0 == strcmp(__progname, "self-gzip"))
    {
        printf("this is self gzip commandn");
    }
    else
    {
        printf("should create a linkn");
    }

    return 0;
}

编译:

gcc main.c -o simu-bb

新建链接

ln -s simu-bb self-ping
ln -s simu-bb self-gzip

运行结果

Linux

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分