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);
    }
    
  • 相关阅读:
    idea中,引用不到项目中的类
    java代码中获取spring容器
    SpringBoot--ApplicationRunner接口
    二、Kafka 快速入门-linux命令行操作
    iOS
    文本输入框默认弹出中文的复制粘贴
    AppleId
    WeChat
    Universal Links在Swift上的应用
    协程的原理以及与线程的区别
  • 原文地址:https://www.cnblogs.com/fortunely/p/14938916.html
Copyright © 2011-2022 走看看