函數chdir、fchdir和getcwd
chdir、fchdir函數
每個進程都有一個當前工作目錄,當前目錄是進程的一個屬性
當用戶登錄UNIX系統時,其當前工作目錄通常是口令文件/etc/passwd中該用戶登錄項的第6個字段
進程調用chdir或fchdir函數可以更改當前工作目錄
#include<unistd.h>
int chdir(constchar*pathname);
int fchdir(int fd);
Bothreturn:0if OK,−1 on error
代碼1. chdir和fchdir函數原型
實例
/**
* 文件內容:因為當前工作目錄是進程的一個屬性,所以它只影響到調用chdir的進程本身
* 而不影響其他進程
* 文件時間:
* 作者:firewaywei@126.com
*/
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
if(chdir("/tmp")<0)
{
err_sys("chdir failed");
}
printf("chdir to /tmp succeeded\n");
exit(0);
}
代碼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函數
#include<unistd.h>
char*getcwd(char*buf,size_t size);
Returns: buf if OK, NULL on error
代碼3. getcwd函數原型
必須向此函數傳遞兩個參數,一個是緩沖區的地址buf, 另一個是緩沖區的長度size
注意,該緩沖區必須有足夠長的長度以容納絕對路徑名再加上一個終止的null字節,否則返回出錯
實例
/**
* 文件名:mycwd.c
* 文件內容: 將工作目錄更改至一個指定目錄,然后調用getcwd,最后打印該工作目錄
* 時間:2016年 11月 14日 星期一 07:59:08 CST
* 作者:firewaywei@126.com
*/
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include"pathalloc.h"
int main(void)
{
char*ptr = NULL;
size_t size =0;
if(chdir("/usr/spool/uucppublic")<0)
{
err_sys("chdir failed");
}
ptr = path_alloc(&size);
if(getcwd(ptr, size)== NULL)
{
err_sys("getcwd failed");
}
printf("cwd = %s\n", ptr);
if(ptr != NULL)
{
free(ptr);
ptr = NULL;
}
exit(0);
}
代碼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。