zoukankan      html  css  js  c++  java
  • Linux C获取当前工作目录的几种方法

    获取当前工作目录有多种方式。

    1. getcwd 获取工作目录(启动程序的目录)

    getcwd 可以获取当前工作目录,但不是目标程序所在目录,而是启动程序的目录。
    比如,如果从shell 工作目录/home/user启动目标程序(位于/home/user/workspace/testpro/debug/test),那么通过getcwd得到的是/home/user

    同系列函数有3个:
    getcw 调用者提供buf,以及指定最大长度(bytes),函数填充内容。实际路径长度超过指定长度时,会返回NULL,errno被设置。通常路径长度,最大不会超过系统限制_POSIX_PATH_MAX(头文件<limits.h>)。

    getwd 调用者提供buf,函数填充内容。buf长度最少应该是PATH_MAX。

    get_current_dir_name 函数malloc缓冲区,调用者free(释放)缓冲区。

    注意:getcw不适用于开机启动程序(未测试),参见linux下获取程序当前目录绝对路径 |CSDN

    #include <unistd.h>
    
    char *getcwd(char *buf, size_t size);
    
    char *getwd(char *buf);
    
    char *get_current_dir_name(void);
    

    示例

    #include <limits.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <errno.h>
    
    
    #ifdef _POSIX_PATH_MAX
    #define PATHNAME_MAX		POSIX_PATH_MAX
    #else
    #define PATHNAME_MAX		1000
    #endif
    
    
    void pr_currendir()
    {
    	char buf[PATHNAME_MAX];
    
            /* 使用getcwd获取启动目录 */
    	if (NULL == getcwd(buf, sizeof(buf))) {
    		fprintf(stderr, "getcwd error: %s", strerror(errno));
    		exit(1);
    	}
    	printf("current work path: %s
    ", buf);
    
            char *s;
            /* 使用get_current_dir_name获取启动目录 */
    	if ((s = get_current_dir_name()) == NULL) {
    		fprintf(stderr, "getcwd error: %s", strerror(errno));
    		exit(1);
            }
    
    	printf("current dir name: %s
    ", s);
    
            if (s != NULL) {
                free(s); /* 别忘了free get_current_dir_name malloc的缓冲区 */
            }
    }
    

    readlink 用于读取符号连接,并不能直接获取当前运行程序所在目录,而是要结合linux系统自身特点:用readlink,读取符号链接/proc/self/exe来获取目标程序所在目录。

    linux进程在运行的时候,会在/proc/目录下存放有关进程的信息(只存放在RAM),可以通过该伪文件系统和内核数据结构进行交互。/proc/self/exe就是存放的运行程序的路径,等价与/proc/当前运行进程的pid/exe

    #include <unistd.h>
    
    ssize_t readlink(const char *path, char *buf, size_t bufsiz);
    

    示例

    
    void pr_curentdir()
    {
    	char str[PATHNAME_MAX];
    	char buf[PATHNAME_MAX];
    
    	snprintf(str, sizeof(str), "/proc/%d/exe", pid); 
            /* <=> 
            snprintf(str, sizeof(str), "/proc/self/exe"); 
            */
            
    	readlink(str, buf, sizeof(str));
    	printf("current work path: %s
    ", buf);
    }
    
  • 相关阅读:
    C#中Socket多线程编程实例
    VBA之Range对象在Excel单元格赋值示例
    c# 怎么关闭Excel
    C#结构体定义的详解
    asp.net C#调用mencoder处理视频的方法
    Win7系统找回“显示桌面”按钮,Win7系统将显示桌面添加到开始按钮旁
    使用 Visual Studio .NET 客户端执行自动化功能后不退出 Office 应用程序
    c#操作excel后关闭excel.exe的方法
    asp文件的连接11种方法
    Excel对象模型的一些使用心得(C#)
  • 原文地址:https://www.cnblogs.com/fortunely/p/14938916.html
Copyright © 2011-2022 走看看