Linux上使用程序相对路径访问文件【转】

转自:http://blog.csdn.net/yinxusen/article/details/7444249

今天一个朋友问我这个问题,说为什么在Windows上跑得很好的应用程序,移植到Linux上后就读不到跟应用程序在同一文件夹下的文件呢,我说,这是linux和Windows在Work directory上设置的不同。
大家都知道,对于Windows而言,应用程序的默认工作目录就是应用程序所在的目录,它一般是不管应用程序是从哪个目录上下文启动的。那么在不更改工作目录的情况下,读文件使用相对目录就肯定是相于应用程序所在的目录。
但对于Linux而言,应用程序的默认工作目录就不同了,它是默认是继承启动它的进程的工作目录的,也就是说,如果进程是在其它目录下启动,那应用程序的工作目录默认就在其它的目录下。这样的话使用相对路径访问文件就有很大的不确定性:我们永远也不能保证,用户一定是从应用程序所在的目录启动!
那要怎么解决呢,我给的建议是,在程序启动后,修改应用程序的当前目录到应用程序所在的目录,然后其它所有程序都无须改动。最好的办法当然只有一个,那就是通过main函数传入的argv[0]计算出当前目录。
下面的例子是读取跟应用程序所在同一目录的a.txt文件并显示,程序启动后修改当前工作目录为应用程序所在的目录,所以不管应用程序从哪个目录启动,程序都能正确地读到a.txt这个文件。
01
#include <stdio.h>
02
#include <string.h>
03
#include <libgen.h>
04
#include <unistd.h>
05

06
void main(int argc,char* argv[]){
07
    char buf[256];
08
    chdir(dirname(argv[0])); //设置当前目录为应用程序所在的目录。其实,就只要加入这一句,就可以使用windows一样的方式用相对路径打开文件了!
09
    FILE* fp=fopen("./a.txt","r");
10
    if(fp==NULL){
11
        printf("Can‘t read file ./a.txt\n");
12
        return;
13
    }
14
    fread(buf,255,1,fp);
15
    fclose(fp);
16
    printf("%s\n",buf);
17
}
在shell中同样可以保证使用相对路径,同样的,$0参数是调用命令,使用`dirname $0`,可取得shell脚本的真实路径.cd到这个路径后也可以使用相对路径了.
时间: 2025-01-07 19:00:36

Linux上使用程序相对路径访问文件【转】的相关文章

linux上应用程序的执行机制

linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信息. 1.父进程的行为: 复制,等待 执行应用程序的方式有很多,从shell中执行是一种常见的情况.交互式shell是一个进 程(所有的进程都由pid号为1的init进程fork得到,关于这个话题涉及到Linux启动和初 始化,以及idle进程等,有空再说),当在用户在shell中敲入./test执行程序时,

在Linux上使用logwatch分析监控日志文件

原文:http://seanlook.com/2014/08/23/linux-logwatch-usage/ 1. 介绍 在维护Linux服务器时,经常需要查看系统中各种服务的日志,以检查服务器的运行状态. 如登陆历史.邮件.软件安装等日志.系统管理员一个个去检查会十分不方便:且大多时候,这会是一种被动的检查,即只有在发现系统运行异常时才会想到去查看 日志以获取异常的信息.那么如何主动.集中的分析这些日志,并产生报告,定时发送给管理员就会显得十分重要. logwatch 是一款用 Perl 语

解决Linux上tomcat启动却无法访问

linux中tomcat的安装 安装tomcat前首先要安装对应的jdk并配置Java环境 下载tomcat安装包 下载路径:https://tomcat.apache.org/download-80.cgi 将tar.gz包上传包linux CRT中Alt+P可打开SFTP传输,其中常用的指令如下: lpwd:本地路径 pwd:linux上路径 lcd:cd到本地路径 cd:cd到linux路径 解压安装 解压:tar -zxvf apache-tomcat-8.5.35.tar.gz 到bi

linux上ln命令详细说明(link 文件连接)

ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间.例如:ln –s /bin/less /usr/local/bin/less -s 是代号(symbolic)的意思.

win7+PuTTy+Xming远程运行linux上的程序(能显示程序界面)

1.安装xming,运行XLaunch,依次选择 multiple window start a program xterm     Using Putty     ...(远程主机的ip等参数) 勾选Clipboard,在additional parameters for PuTTy or SSH填入 -X xming配置完成. 2.配置PuTTy,找到路径Connection->SSH->X11,做一些设置 3.接下来正常连接上ssh,然后运行程序,如wireshark,出现wiresha

在window和linux上通用的SprtLock类头文件

/**@file         SprtLock.h@brief        Sprt锁操作类,SprtLock类 @author      cxw@version     版本编号:1.0   日期:2014-10-28 修订者:Long 修订内容:按照<C++编码规范>修改源文件*//* #pragma once是编译器相关的,有的编译器支持,有的编译器不支持,具体情况请查看编译器API文档,不过现在大部分编译器都有这个杂注了.#ifndef,#define,#endif 是C/C++

linux上不能显示Jfreechart的图片文件

 出现错误: Jan 23, 2015 4:19:21 PM org.apache.catalina.core.StandardWrapperValve invokeSEVERE: Servlet.service() for servlet [DisplayChart] in context with path [/aldb] threw exception [Chart image not found] with root causejavax.servlet.ServletException

分析Linux上的程序依赖

ldd [path_to_exe] ldd通过调用动态链接器来获取可执行程序的依赖库,但是并不推荐在未知的可执行程序上执行业ldd来获取其依赖库,因为部分版本的ldd会直接通过调用该可执行程序来获取其依赖库,这存在安全风险. objdump -p /usr/local/php/bin/php |grep NEEDED 直接依赖库 nm [path_exe] | grep [function_symbol] 分析模块符号 sudo pldd [PID] 分析正在运行中的程序依赖的动态链接库 还有个

Linux svn服务器的存放路径和文件详解

svn有两种存储方式:BDB和FSFS,目前用的最多的是FSFS方式,这种方式的话,一般是存储在\db\revs文件夹下,里面有一堆以版本号命名的文件,如:0.1.2.3.4......,那个就是了 例如:/var/svn/svnrepos/db/revs /var/svn/svnrepos/是svn版本库目录 db/revs/存储的svn上传文件等的目录 [[email protected] revs]# pwd /var/svn/svnrepos/db/revs [[email protec