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\n", 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\n", 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\n", buf);
}
posted @ 2021-06-26 20:05  明明1109  阅读(5152)  评论(0编辑  收藏  举报