• 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);
    }
    
  • 相关阅读:
    linux上的工具或软件
    百度分享插件怎么取消鼠标放在图片上出现的分享条
    常用的Lambda表达式
    IDEA安装使用Lombok插件
    Spring cloud Eureka错误锦集(二)
    Spring cloud Eureka错误锦集(一)
    Navicat破解
    手动添加jar包到本地仓库
    Markdown常用语法
    Java中的位运算符
  • 原文地址:https://www.cnblogs.com/fortunely/p/14938916.html
Copyright © 2020-2023  润新知