函数chdir、fchdir和getcwd

chdir、fchdir函数

    每个进程都有一个当前工作目录,当前目录是进程的一个属性
    当用户登录UNIX系统时,其当前工作目录通常是口令文件/etc/passwd中该用户登录项的第6个字段
    进程调用chdir或fchdir函数可以更改当前工作目录

  1. #include<unistd.h>
  2. int chdir(constchar*pathname);
  3. int fchdir(int fd);
  4. Bothreturn:0if OK,−1 on error
代码1. chdir和fchdir函数原型

实例

  1. /**
  2. * 文件内容:因为当前工作目录是进程的一个属性,所以它只影响到调用chdir的进程本身
  3. * 而不影响其他进程
  4. * 文件时间:
  5. * 作者:firewaywei@126.com
  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. * 作者:firewaywei@126.com
  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
 
 
 

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

  1. 文件和目录之chdir、fchdir和getcwd函数

    每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点(不以斜杠开始的路径名为相对路径名).当用户登录到UNIX系统时,其当前工作目录通常是口令文件(/etc/passwd)中该用户登录项的第 ...

  2. apue chapter 4 文件和目录

    1.文件信息结构体 struct stat{ mode_t st_mode; //file type and permissions ino_t st_ino; //i-node number (se ...

  3. UNIX环境高级编程--4

    函数stat fstat fstatat 和 lstat stat函数使用最多的地方可能就是ls -l 命令,用其可以获得有关一个文件的所有信息. 文件类型: (1)普通文件 (2)目录文件 (3)块 ...

  4. Files and Directories

    Files and Directories Introduction     In the previous chapter we coveredthe basic functions that pe ...

  5. 【APUE】Chapter4 File and Directories

    4.1 Introduction unix的文件.目录都被当成文件来看待(vi也可以编辑目录):我猜这样把一起内容都当成文件的原因是便于统一管理权限这类的内容 4.2 stat, fstat, fst ...

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

    access(判断是否具有存取文件的权限) 相关函数 stat,open,chmod,chown,setuid,setgid 表头文件 #include<unistd.h> 定义函数 in ...

  7. getcwd函数学习

    getcwd 函数原型:char *getcwd( char *buffer, int maxlen ); 功 能:获取当前工作目录 参数说明:getcwd()会将当前工作目录的绝对路径复制到参数bu ...

  8. Linux中文件函数(二)

    一.link.linkat.unlink.unlinkat.remove函数 创建一个指向现有文件的链接的方法是使用link函数或linkat函数.函数的原型为: #include <unist ...

  9. 【Linux C中文函数手册】之 目录操作函数

    目录操作函数 1)closedir 关闭目录 相关函数: opendir表头文件: #include<sys/types.h> #include<dirent.h>定义函数: ...

随机推荐

  1. Java面向对象 Main函数 静态的应用 单例设计模式

     Java面向对象 Main函数 静态的应用与单例设计模式 知识概要             (1)Main函数的细解 (2)静态的应用,静态变量,静态代码块,静态函数 (3)单例设计模式 1.M ...

  2. NOIP初赛 之 哈夫曼树

    哈夫曼树 种根据我已刷的初赛题中基本每套的倒数第五或第六个不定项选择题就有一个关于哈夫曼树及其各种应用的题,占:0-1.5分:然而我针对这个类型的题也多次不会做,so,今晚好好研究下哈夫曼树: 概念: ...

  3. 使用BigQuery分析GitHub上的C#代码

    一年多以前,Google 在GitHub中提供了BigQuery用于查询的GitHub上的开源代码(open source code on GitHub available for querying) ...

  4. 真正从0开始用Unity3D制作类战地2玩法的类龙之谷、王者荣耀的手游(暨全平台游戏)

    如题,(从2017年10月18日开始)正在利用业余时间研发一款神泣Shaiya2手游,引擎用Unity3D. 原因主要有2点: 对神泣太多感情,希望能做点什么来纪念乃至留下神泣这款网游: 时机已到,是 ...

  5. UVa11054

    一开始WA了一次,这才反应过来应该用longlong而不是int,但是scanf和printf不知道哪出毛病了,运行不出来正确的结果,改成cin cout过了 从左向右扫描即可,对于第i的村庄到第i+ ...

  6. Linux入门(16)——Ubuntu16.04下配置sublime text 3使用markdown

    sublime text 3安装两个插件: MarkDown Editing OmniMarkupPreviewer 有的人使用 MarkDown Editing markdownpreviewer ...

  7. HTML笔记<note2>

    文本标记 我是正常的文本段落 我是用b标记的加粗文本 我是用strong定义的强调文本 i标记的倾斜文本 em强调文本 del标记的删除线 del标记的下划线文本 特殊字符标记 显示 说明 空格&am ...

  8. emacs 配置

    个人的Emacs配置,环境是archlinux,参考了不少网上资料,因为太多,就不一一列举了,在这里感谢那些作者的辛苦经验劳动. (custom-set-variables ;; custom-set ...

  9. LeetCode 79. Word Search(单词搜索)

    Given a 2D board and a word, find if the word exists in the grid. The word can be constructed from l ...

  10. JS框架设计读书笔记之-函数

    这次写一些函数 1.模拟Object.keys方法 Object.keys = Object.keys || function(obj){ var a = []; // a[0],a[1]...分别赋 ...