新发基金的好处和坏处是什么?新基金的封闭期一般是多久?
新发基金的好处和坏处是什么?新发基金的优点:1、认购费率低:一般
2023/07/06
如果需要在程序内部获取当前运行程序的名称,可以使用如下 4 种方式:
(相关资料图)
argv[0]
;/proc/self/comm
、/proc/self/cmdline
;__progname
;readlink("/proc/self/exe")
;下面说一下这几种方式适用的场景。
如果仅仅想得到可执行程序的名称,不需要目录信息,可以使用 __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);
如果想得到程序执行时在 终端输入的命令行,可以使用 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);
如果想得到可执行程序所在的具体位置,那么就使用 /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);
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
多数情况下只需获取程序的名称,__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-pingln -s simu-bb self-gzip
运行结果:
标签: