1. 前言如果需要在程序内部获取当前运行程序的名称,可以使用如下 4 种方式:
argv[0];/proc/self/comm、/proc/self/cmdline;__progname;readlink(/proc/self/exe);下面说一下这几种方式适用的场景。
2. 适用场景2.1 仅获取程序名称如果仅仅想得到可执行程序的名称,不需要目录信息,可以使用 __progname 或 /proc/self/comm。
//__prognameextern char *__progname;printf(program name:%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 #include #include #include #include #include #include #include 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-name4. 运行结果4.1 运行程序本身
4.2 运行链接程序
5. 总结多数情况下只需获取程序的名称,__progname,足矣。
tips得到程序的名称有什么用呢?
可以根据程序中获取到的程序名称的不同执行不同的功能 ,大名鼎鼎的 busybox 就是这么干的!其原理就是针对可执行程序创建不同名称的链接文件,链接文件执行时在程序中可以得到链接文件的名称,以此名称为判断条件执行不同的功能。
busyboxbusybox --help :
自实现main.c :
#include #include #include 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运行结果 :
张海霞谈“中国芯”现状:我们表面是缺芯,但实际上是缺人
美爆了!设计师曝光iPhone 8 无框屏幕令机身激似玻璃
CES2012:柯达WiFi数码相机M750 售价170美元
小米手表e-SIM技术细节揭露,明天发布
浅谈碳中和目标下如何构建新型企业微电网
Linux C语言获取当前程序名称的三种方式
中国企业迎来出海大潮,如何保障数据安全合规?
凭实力碾压友商!中小企业网站建设盲选华为云这款轻量应用服务器
重磅!达摩院2021十大科技趋势
降低汽车音响系统噪声与功耗应用电路设计
GP8510是一款高性能PAC芯片,它的功能都有哪些
广和通与华大北斗达成全球战略合作,携手打造高精度GNSS定位解决方案
【RTT大赛作品连载】AB32VG1评估板 音乐播放器
110语音配线架连接方法指南
iRobot:正在研究补丁来修复i7和s9型号机器人
2021真无线蓝牙耳机推荐:618满意度超高的蓝牙耳机排名前十
技术 | 交流伺服电机振动故障的分析与解决方案
焕新升级!RT-Thread官网2.0应运而生
电工仪器仪表_电工常用仪器仪表_多功能电力仪器仪表品牌
“后摩尔 芯C位”,奎芯科技品牌开放日圆满举办