int chdir(const char *path );
說明:chdir函數用於改變當前工作目錄。調用參數是指向目錄的指標,調用進程需要有搜尋整個目錄的許可權。每個進程都具有一個當前工作目錄。在解析相對目錄引用時,該目錄是搜尋路徑的開始之處。如果調用進程更改了目錄,則它只對該進程有效,而不能影響調用它的那個進程。在退出程式時,shell還會返回開始時的那個工作目錄。
(1) 核心解析參數中的路徑名,並確保這個路徑名有效。為了做到這一點,就路徑名解析而言,核心使用相同的演算法。如果路徑名無效,它輸出錯誤訊息並退出。
(2) 如果路徑名有效,核心定位該目錄的索引節點,並檢查它的檔案類型和許可權位,確保目標檔案是目錄以及進程的所有者可以訪問該目錄(否則改變到新目錄就沒有用)。
(3) 核心用新目標目錄的路徑名和/或索引節點替換u區中目前的目錄路徑名和/或它的索引節點號。
錯誤資訊:
EFAULT: path 指向了非法地址
ENAMETOOLNG:路徑過長
ENOENT:檔案不存在
ENOMEM:核心記憶體不足
ENOTDIR:給出路徑不是目錄
EACCES:無訪問路徑中某個目錄的許可權
ELOOP:解析路徑中太多的符號連結
EIO:發生I/O錯誤
執行個體1:
/*chdir.c:this program using chdirr*/
#include <unistd.h>
#include <iostream>
int main(void)
{
long cur_path_len;
char* cur_work_dir;
if((cur_path_len = pathconf(".",_PC_PATH_MAX)) == -1)
{
perror("Couldn`t get currentworking path length");
return 1;
}
std::cout<<"Current path lengthis "<< cur_path_len<<std::endl;
if((cur_work_dir = (char*)malloc(cur_path_len)) == NULL)
{
perror("Couldn't allocate memoryfor the pathname");
return 1;
}
if (getcwd(cur_work_dir,cur_path_len)==NULL)
{
perror("Couldn`t get currentworking directory!");
}
else
{
std::cout<< "Currentworking directory is"<<cur_work_dir<<std::endl;
}
if(chdir("..") == -1)
{
perror("Couldn`t change current working diretory!");
return 1;
}
if ((getcwd(cur_work_dir,cur_path_len)) == NULL)
{
perror("Couldn`t get currentworking directory!");
return 1;
}
std::cout<<"Afterchangedirectory,Current working directory is"<<cur_work_dir<<std::endl;
free(cur_work_dir);
return 0;
}