• 函数chdir、fchdir和getcwd


    函数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 ");
    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 ", 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
     
     
     

     

  • 相关阅读:
    引用类型构造器
    正则指引量词
    Ajax的XMLHttpRequest对象
    正则指引字符组
    方法可变数量的参数
    不使用XMLHttpRequest实现异步加载:Iframe和script
    可选参数、命名参数
    常量和字段
    正则指引括号
    值类型实例构造器
  • 原文地址:https://www.cnblogs.com/fireway/p/6064262.html
Copyright © 2020-2023  润新知