我知道程序名称作为第一个参数传递,下一个简单示例将它打印到标准输出:
#include <iostream>
int main ( int argc, char *argv[] )
{
std::cout<<argv[0]<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
是否有获取程序名称的功能?
编辑
我从shell启动程序,上面的代码将始终打印程序名称(我使用Fedora 9,但我相信它适用于其他发行版).
我发现/ proc/self /目录可能包含我要查找的内容,但我无法找到该目录中的确切内容.
安装了两个Python解释器:
[user@localhost ~]$ /usr/bin/python -V && /usr/local/bin/python -V
Python 2.4.3
Python 2.7.6
Run Code Online (Sandbox Code Playgroud)
PATH它运行的每个命令的Sudo更改如下:
[user@localhost ~]$ env | grep PATH && sudo env | grep PATH
PATH=/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/user/bin
PATH=/usr/bin:/bin
Run Code Online (Sandbox Code Playgroud)
我运行一个测试脚本:
[user@localhost ~]$ cat what_python.py
#!/usr/bin/env python
import sys
print sys.executable
print sys.version
[user@localhost ~]$ sudo python what_python.py
/usr/bin/python
2.7.6 (default, Feb 27 2014, 17:05:07)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)]
Run Code Online (Sandbox Code Playgroud)
并获取Python 2.4.3 in sys.executable和2.7.6版中的路径sys.version.显然sys.executable,sys.version不匹配.考虑到sudo如何修改PATH,我可以理解它的价值sys.executable.但是,为什么sys.version报告版本2.7.6而不是版本2.4.3,它会匹配usr/bin/python报告的路径sys.executable?
这是我的问题的后续事件Sudo更改PATH,但执行相同的二进制文件
在我被标记为重复之前,我能找到的所有类似问题在引入 std::filesystem 之前都有答案,并且使用特定于平台的代码或 Boost::filesystem。我正在寻找一个使用 std::filesystem 的便携式答案。
是否可以使用 std::filesystem 获取 C++ 可执行文件所在的路径(而不是工作目录)?如果是的话,怎么样?
我有一个程序,通过使用相对路径(例如'..')打开文件.
现在问题是,当我从另一个目录执行程序时,相对路径不是相对于程序而是相对于工作目录.因此,如果我使用'/ path/to/program/myprog'启动程序,则无法找到该文件.
有没有办法独立于工作目录执行程序?Id est,as如果工作目录是程序所在的目录?或者我只是以一种过于复杂的方式思考,并且有一种更简单的方式来引用文件,哪个位置只能通过相对于程序文件路径的路径来识别?
我在另一个论坛上找到了这个,应该可以给你。但我认为这可能不是最好的方法,而且我认为它会由于数组未被删除而导致内存泄漏。这是真的?
这也是最好的方法吗?最好的方法是直接提供文件夹目录的跨平台命令(如果不存在则使用 Windows)。
std::string ExePath()
{
using namespace std;
char buffer[MAX_PATH];
GetModuleFileName(NULL, buffer, MAX_PATH);
string::size_type pos = string(buffer).find_last_of("\\/");
if (pos == string::npos)
{
return "";
}
else
{
return string(buffer).substr(0, pos);
}
}
Run Code Online (Sandbox Code Playgroud) 如果我的go程序可以以不同的方式执行(cron,monit等等),那么在运行时期间获取包含可执行文件的目录的最可靠方法是什么?
在python中,这将是变量:
os.path.realpath(__file__)
Run Code Online (Sandbox Code Playgroud) 这与HPUX上运行进程的可执行文件的完整路径类似,但AIX除外.
基本问题是:在AIX上,我如何确定当前可执行文件的完整路径?在做任何其他事情之前必须这样做(例如chdir),这很好.
到目前为止,我发现的最准确的答案是检查输出
svmon -P $$ -O format=nolimit,filename=on,filtertype=client
(其中$$有shell的意思是:当前的pid).这不仅是大量的C,而且svmon也不是很快,并且很容易压倒其余应用程序的运行时.
下一个最佳答案似乎只是简单地看一下argv[0],如果它有一个斜杠,它可以是一个完整的路径名(以前导/开头)或相对于当前的目录名(不是从头开始)领先/).如果它没有斜线,它就相对于某些东西而言PATH.
如果在这个解决方案之后,我最终得到了一个符号链接,那么也需要处理所有符号链接(硬链接可能超出任何解决方案的范围).这个解决方案看起来像是相对跨平台的,但在C代码中也很重(应该比svmon更快).我希望有竞争条件等等.
谢谢,
更新:我正在寻找一个提交给perl开发者的解决方案.而且他们会担心不安全的PATH,尤其是在setuid/ setgid场景.见perlsec.我认为我们可以在这里做好,但如果你结合setuid假装argv[0],你可以强迫perl认为它在其他地方,并加载错误的模块.上面的"下一个最佳"答案只有在perl的污点模式下才能真正起作用.
我编写了一个 C++ 软件,该软件需要从其所在的文件夹中读取文件,然后在同一文件夹中写入其他文件。
目前,我通过 shell 导航到复制了可执行文件的文件夹,然后使用./executable_name.
我想通过双击来执行它。如果我这样做,软件告诉我它找不到输入文件,那么就好像它没有在正确的文件夹中执行。
我认为有两种方法:
无论如何,我不知道该怎么做。
有人可以帮帮我吗?
可能重复:
如何在C中查找可执行文件的位置
我正在使用GTK +在C++中编写一个多平台应用程序,我遇到了问题.我必须得到程序路径.例如,当节目在/home/user/program(或C:\Users\user\program.exe)时,我有/home/user/(或C:\Users\user\).
可以以及如何做到这一点?
我对c/c ++场景很陌生,我已经在虚拟机上用勺子喂了太长时间.
我正在修改我们在整个公司使用的现有C++工具.该工具正在所有主要操作系统(Windows,Mac,Ubuntu,Solaris等)上使用.我正在尝试使用另一个编写Java的工具来桥接该工具.基本上我只需要从C++工具中调用java -jar.
问题是,我怎么知道jar在用户计算机上的位置?c ++可执行文件当前被检入Perforce,用户同步然后调用exe,可能会将exe留在原位(尽管他们可以将其复制到其他地方).我当前的解决方案检查exe旁边的jar文件.
我已经看过多种方法来计算来自C++的exe的位置,但它们似乎都不是可移植的.在Windows上有一个'GetModuleLocation',在posix上你可以查看procs/process.exe信息来确定进程的位置.在大多数系统中,您可以查看argv [0]以确定exe的位置.但是由于用户使用$ PATH,符号链接等来调用exe,因此大多数这些技术都是100%保证的.
那么,任何关于正确的方法的指导总能奏效吗?我想如果有多个解决方案我没有问题,但似乎应该有更优雅的方式来做到这一点.
可能重复:
如何在C中查找可执行文件的位置
嗨,
我正在寻找一种可移植的方法来查找程序的根目录(在C++中).例如,在Linux下,用户可以将代码复制到/ opt,将其添加到PATH,然后执行它:
cp -r my_special_code /opt/
export PATH=${PATH}:/opt/my_special_code/
cd /home/tony/
execution_of_my_special_code
Run Code Online (Sandbox Code Playgroud)
(其中"execute_my_special_code"是/ opt/my_special_code中的程序).
现在,作为"execution_of_my_special_code"的开发人员,是否有一种可移植的编程方法可以发现可执行文件位于/ opt/my_special_code中?
第二个例子是在MS Windows上:如果我当前的工作目录在一个硬盘驱动器上(例如"C:\")而可执行文件放在另一个硬盘驱动器上(例如"D:\")怎么办?
最终,目标是读取与程序代码一起打包的一些预定义配置文件,而不强制用户进入安装目录.
非常感谢提前!