函数chdir、fchdir和getcwd

函数chdir、fchdir和getcwd

chdir、fchdir函数

每个进程都有一个当前工作目录,当前目录是进程的一个属性

当用户登录UNIX系统时,其当前工作目录通常是口令文件/etc/passwd中该用户登录项的第6个字段

进程调用chdir或fchdir函数可以更改当前工作目录

  1. #include <unistd.h>
  2. int chdir(const char *pathname);
  3. int fchdir(int fd);
  4. Both return: 0 if OK, ?1 on error

代码1. chdir和fchdir函数原型

实例

  1. /**
  2. * 文件内容:因为当前工作目录是进程的一个属性,所以它只影响到调用chdir的进程本身
  3. * 而不影响其他进程
  4. * 文件时间:
  5. * 作者:[email protected]
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. int main(void)
  10. {
  11. if (chdir("/tmp") < 0)
  12. {
  13. err_sys("chdir failed");
  14. }
  15. printf("chdir to /tmp succeeded\n");
  16. exit(0);
  17. }

代码2. chdir函数实例

编译如下:

gcc main.c -lerror -Llib

运行如下:

$ pwd
/home/fireway/study/temp2
$ ./a.out 
chdir to /tmp succeeded

从中我们可以看出,执行a.out命令的shell的当前目录并没有改变,这是shell执行程序工作方式的一个副作用

每个程序运行在独立的进程中,shell的当前工作目录并不会随着程序调用chdir而改变。由此可见,为了改变shell进程自己的工作目录,shell应当直接调用chdir函数,为此,cd命令内建在shell中。

getcwd函数

  1. #include <unistd.h>
  2. char *getcwd(char *buf, size_t size);
  3. Returns: buf if OK, NULL on error

代码3. getcwd函数原型

必须向此函数传递两个参数,一个是缓冲区的地址buf, 另一个是缓冲区的长度size

注意,该缓冲区必须有足够长的长度以容纳绝对路径名再加上一个终止的null字节,否则返回出错

实例

  1. /**
  2. * 文件名:mycwd.c
  3. * 文件内容: 将工作目录更改至一个指定目录,然后调用getcwd,最后打印该工作目录
  4. * 时间:2016年 11月 14日 星期一 07:59:08 CST
  5. * 作者:[email protected]
  6. */
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <stdlib.h>
  10. #include "pathalloc.h"
  11. int main(void)
  12. {
  13. char *ptr = NULL;
  14. size_t size = 0;
  15. if (chdir("/usr/spool/uucppublic") < 0)
  16. {
  17. err_sys("chdir failed");
  18. }
  19. ptr = path_alloc(&size);
  20. if (getcwd(ptr, size) == NULL)
  21. {
  22. err_sys("getcwd failed");
  23. }
  24. printf("cwd = %s\n", ptr);
  25. if (ptr != NULL)
  26. {
  27. free(ptr);
  28. ptr = NULL;
  29. }
  30. exit(0);
  31. }

代码4. getcwd函数实例

编译此程序

gcc main.c -lerror -L../temp3

运行此程序

# ln -s /home/fireway/study/temp3 /usr/spool
# ./a.out 
cwd = /home/fireway/study/temp3/uucppublic
# ls -l /usr/spool
lrwxrwxrwx 1 root root 25 11月 14 08:24 /usr/spool -> /home/fireway/study/temp3

注意,chdir跟随符号链接,当是当getcwd沿着目录树上溯到/home/fireway/study/temp3目录时,它并不了解该目录由符号链接/usr/spool所指向。这就是符号链接的一种特性。

getcwd函数可以让我们在更换目录之前,先保存之前的工作目录,在完成之后,就可以将保存的原工作目录路径名作为参数传递给chdir,这样就返回了文件系统的出发点。

fchdir函数提供更快捷简便 的方式,在更换到其他路径之前,无需调用getcwd函数,而是调用open打开当前工作目录,然后保存其返回的fd, 当希望回到原工作目录时,只要简单地将fd传递给fchdir

参考

UNIX环境高级编程(第三版)    4.23 函数chdir、fchdir和getcwd

时间: 2024-10-31 22:23:07

函数chdir、fchdir和getcwd的相关文章

APUE学习笔记:第四章 文件和目录

4.1 引言 本章将描述文件的特征和文件的性质 4.2 stat.fstat和lstat函数 #include<sys/stat.h> int stat(const char *restrict pathname,struct stat *restrict buf); int fstat(int filedes,struct stat *buf) int lstat(const char *restrict pathname,struct stat *restrict buf); 三个函数的返

【APUE】Chapter4 File and Directories

4.1 Introduction unix的文件.目录都被当成文件来看待(vi也可以编辑目录):我猜这样把一起内容都当成文件的原因是便于统一管理权限这类的内容 4.2 stat, fstat, fstatat and lstat Functions & 4.3 File Types 1. 介绍一个系统提供的结构体 struct stat,里面包含了与文件相关的各种信息. 书上还介绍,unix系统命令ls -l就是用了上面的数据结构. 2. File Types 书上一共介绍如下几种文件类型: (

Files and Directories

Files and Directories Introduction In the previous chapter we coveredthe basic functions that perform I/O. The discussion centered on I/O for regular files-opening a file, and reading or writing a file. We'll now look at additionalfeatures of the fil

文件权限控制篇access alphasort chdir chmod chown chroot closedir fchdir fchmod fchown fstat ftruncate getcwd

access(判断是否具有存取文件的权限) 相关函数 stat,open,chmod,chown,setuid,setgid 表头文件 #include<unistd.h> 定义函数 int access(const char * pathname,int mode); 函数说明 access()会检查是否可以读/写某一已存在的文件.参数mode有几种情况组合,R_OK,W_OK,X_OK 和F_OK.R_OK,W_OK与X_OK用来检查文件是否具有读取.写入和执行的权限.F_OK则是用来判断

8Linux服务器编程之:chdir()函数和cd命令,getcwd()函数和pwd

 1chdir依赖的头文件 #include<unistd.h> 2函数定义 int chdir(const char *path); int fchdir(int fd); 函数说明: chdir的作用是改变工作目录 4getcwd依赖的头文件 #include<unistd.h> 5函数定义: char *getcwd(char *buf, size_t size); 函数说明,通过这个函数获得路径 6.案例说明: 7.pathconf依赖的头文件 #include<

C语言函数手册学习

目录 1.字符测试函数 2.字符串操作函数 3.内存管理函数 4.日期与时间函数 5.数学函数 6.文件操作函数 7.进程管理函数 8.文件权限控制函数 9.信号处理函数 10.接口处理函数 11.环境变量函数 12.终端控制函数 总结:这次偶然间找到了C语言函数手册,看他分类分的很清楚,就花了几个小时学一下,具体的函数讲解可以点击链接查看,或者查找手册,常用的函数就是我知道已经碰到过的函数,或者是用过的函数. 1.字符测试函数 1.1 isxdigit() 1.2 isupper() 1.3i

linux学习笔记之文件结构和函数

一.基础介绍. 1:文件的构成. 1,首先声明,这里的文件和目录,仅仅表示普通的文件和目录.不代表设备,管道等特殊形式的文件(UNIX把它们也当作文件处理). 2,目录的构成:v节点编号和文件名. 1)v节点:文件系统相关的节点.文件类型,各类文件操作函数指针.但目录中包含的是节点编号,不是节点本身. 3,文件的构成:v节点和i节点. 1)i节点:文件所有者,长度,磁盘实际所在位置指针等. 2)linux中,没有v节点,只有两个i节点.一个和文件系统相关,一个无关. 3)链接文件的实际内容(数据

linux应用程序编程应该要学习的函数使用列表

linux应用程序编程应该要学习的函数使用列表 linux应用层编程相关的man page,具体包括的命令和函数,请参考https://www.kernel.org/doc/man-pages/ select().pselect().poll().epoll(), epoll_create(),epoll_wait(),epoll_ctl(),close()==同时监控多个fd的输入.输出 inotify机制,inotify_init(),inotify_add_watch(),inotify_

php函数超实用

DateTime DateTime::addDateTime::diffDateTime::formatDateTime::modifyDateTime::sub... * DateInterval format character Description% Literal %Y Years, numeric, at least 2 digits with leading 0y Years, numericM Months, numeric, at least 2 digits with lea