函數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\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
 
 
 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM