在C/C++中有没有办法找到当前执行的程序的位置(完整路径)?

(argv[0]的问题在于它没有给出完整的路径.)

推荐答案

总结一下:

  • 在Unix上,有/proc个真正直接可行的方法是:

    • readlink("/proc/self/exe", buf, bufsize)(Linux)

    • readlink("/proc/curproc/file", buf, bufsize)(FreeBSD)

    • readlink("/proc/self/path/a.out", buf, bufsize)(Solaris)

  • 在不含/proc的UNIX上(即,如果以上失败):

    • 如果argv[0]以"/"开头(绝对路径),这就是路径.

    • 否则,如果argv[0]包含"/"(相对路径),则将其附加到cwd

    • 否则,在$PATH中的目录中搜索可执行文件argv[0].

    之后,可以判断可执行文件是否实际上不是符号链接.

    这个步骤在/proc方法中不是必需的(至少对于Linux是这样).

    请注意,正确设置argv[0]取决于调用进程. 这在大多数情况下是正确的,但是,在某些情况下,调用进程是不可信的(例如,setuid可执行文件).

  • 在Windows上:使用GetModuleFileName(NULL, buf, bufsize)

C++相关问答推荐

你能用自己的地址声明一个C指针吗?

GCC:try 使用—WError或—pedantic using pragmas

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

以下声明和定义之间的区别

如何识别Linux中USB集线器(根)和连接到集线器(根设备)的设备(子设备)?

1处的解析器错误:yacc语法的语法错误

==284==错误:AddressSaniizer:堆栈缓冲区下溢

如何使用FSeek和文件流指针在C中查找文件的前一个元素和前一个减go 一个元素

生产者消费者计数器意外输出的C代码

宏观;S C调深度

为什么会出现此错误?二进制表达式的操作数无效

在printf()中用%.*S格式填充长度为0的字符串是否会调用任何UB?如果是,是哪一个?

Linux/C:带有子进程的进程在添加waitid后都挂起

Dlsym()的手册页解决方法仍然容易出错?

';malloc():损坏的顶部大小';分配超过20万整数后

未使用sem_open正确初始化信号量

分支预测和UB(未定义的行为)

如何使用 VLA 语法使用 const 指针声明函数

变量的指针右对齐,函数的指针左对齐

为什么实现文件中的自由函数默认没有内部链接?