嵌入式技术
如果需要在程序内部获取当前运行程序的名称,可以使用如下 4 种方式:
argv[0]
;/proc/self/comm
、/proc/self/cmdline
;__progname
;readlink("/proc/self/exe")
;下面说一下这几种方式适用的场景。
如果仅仅想得到可执行程序的名称,不需要目录信息,可以使用 __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);
如果想得到程序执行时在 终端输入的命令行 ,可以使用 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);
如果想得到可执行程序所在的具体位置,那么就使用 /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);
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
多数情况下只需获取程序的名称,__progname
,足矣。
得到程序的名称有什么用呢?
可以根据程序中获取到的程序名称的不同执行不同的功能 ,大名鼎鼎的 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-ping
ln -s simu-bb self-gzip
运行结果 :
全部0条评论
快来发表一下你的评论吧 !