函数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. Ubuntu12.04 Firefox安装flash

    1. 实验环境 Ubuntu 14.04x86 2.安装步骤 2.1 浏览器访问:https://get.adobe.com/flashplayer/?loc=cn 2.2 网址会自动识别ubuntu ...

  2. ubuntu mount u盘以及cp拷贝文件夹

    如果是ubuntu桌面环境的话,不用mount,接入的U盘就可以直接被系统识别,访问起来非常方便,但如果没有桌面环境呢,比如在ubuntu server端,如何访问U盘呢? 第一步:查看U盘信息sud ...

  3. 用于Mysql操作的MySqlHelper类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te ...

  4. Echarts数据可视化全解注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  5. Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统

    前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...

  6. Fedora 下 Google-Chrome 经常出现僵尸进程的权宜办法

    对于Chrome_ProcessL 和Chrome_FileThre这两僵尸进程,估计遇到过的人都对其各种无奈吧,放任不管吧,越来越多,然后卡死,只能另开个X环境或者在其他的TTY里干掉他俩再切回去, ...

  7. LINUX 笔记-文件隐藏属性

    chmod u+s xxx 设置setuid(4775) chmod g+s xxx 设置gid(2775) chmod o+t xxx 设置stick bit,针对目录(1775)

  8. [原创]浅谈JAVA在ACM中的应用

    由于java里面有一些东西比c/c++方便(尤其是大数据高精度问题,备受广大ACMer欢迎),所以就可以灵活运用这三种来实现编程,下面是我自己在各种大牛那里总结了一些,同时加上自己平时遇到的一些jav ...

  9. JAVA提高九:集合体系

    在经过了前面的JDK6.0新特性的学习后,将进一步深入学习JDK,因为集合的重要性,因此从集合开始入手分析: 一.集合概况 Java是一种面向对象语言,如果我们要针对多个对象进行操作,那么首先必要将多 ...

  10. 开源纯C#工控网关+组态软件(五)从网关到人机界面

    一.   引子 之前都在讲网关,不少网友关注如何实现界面.想了解下位机变量变化,是怎样一步步触发人机界面动画的. 这个步步触发,实质上是变量组(Group)的批量数据变化(DataChange)事件, ...