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

2023-08-24 16:06:43 来源:大川搬砖

1. 前言

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


(相关资料图)

argv[0]/proc/self/comm/proc/self/cmdline__prognamereadlink("/proc/self/exe")

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

2. 适用场景

2.1 仅获取程序名称

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

//__prognameextern char *__progname;printf("programname:%sn", __progname);// /proc/slef/commchar 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/cmdlinechar 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/exechar 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;staticvoid 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 运行程序本身

4.2 运行链接程序

5. 总结

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

tips

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

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

busybox

busybox --help

自实现

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-pingln -s simu-bb self-gzip

运行结果

标签:

上一篇:嵌入式Linux设备如何添加开机启动文件
下一篇:最后一页