亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

文件和目錄之chdir、fchdir和getcwd函數

2024-06-28 13:28:45
字體:
來源:轉載
供稿:網友
文件和目錄之chdir、fchdir和getcwd函數

每個進程都有一個當前工作目錄,此目錄是搜索所有相對路徑名的起點(不以斜杠開始的路徑名為相對路徑名)。當用戶登錄到UNIX系統時,其當前工作目錄通常是口令文件(/etc/passwd)中該用戶登錄項的第6個字段——用戶的起始目錄(home directory)。當前工作目錄是進程的一個屬性,起始目錄則是登錄名的一個屬性。

進程通過調用chdir或fchdir函數可以更改當前工作目錄。

#include <unistd.h>int chdir( const char *pathname );int fchdir( int filedes );兩個函數的返回值:若成功則返回0,若出錯則返回-1

在這兩個函數中,分別用pathname或打開文件描述符來指定新的當前工作目錄。

實例

因為當前工作目錄是進程的一個屬性,所以它只影響調用chdir的進程本身,而不影響其他進程。

程序清單4-8 chdir函數實例

[root@localhost apue]# cat PRog4-8.c#include "apue.h"intmain(void){        if(chdir("/tmp") < 0)                err_sys("chdir failed");        printf("chdir to /tmp succeeded/n");        exit(0);}

運行結果:

[root@localhost apue]# pwd/home/zhu/apue[root@localhost apue]# ./prog4-8chdir to /tmp succeeded[root@localhost apue]# pwd/home/zhu/apue

從中可以看出,執行上面程序的shell的當前工作目錄并沒有改變,其原因是shell創建了一個子進程,由該子進程具體執行該程序。

因為內核保存有當前工作目錄的信息,所以我們應能取其當前值。不幸的是,內核為每個進程只保存指向該目錄v節點的指針等目錄本身的信息,并不保存該目錄的完整路徑名。

我們需要一個函數,它從當前工作目錄(.目錄項),用..目錄項找到其上一級的目錄,然后讀其目錄項(上一級目錄中肯定有一個目錄項是當前工作目錄),直到該目錄項中的i節點編號與工作目錄i節點編號相同,這樣就找到了其對應的文件名。按照這種方法,逐層上移,直到遇到根,這樣就得到了當前工作目錄完整的絕對路徑名。很幸運,函數getcwd就提供了這種功能。

#include <unistd.h>char *getcwd( char *buf, szie_t size );返回值:若成功則返回buf,若出錯則返回NULL

向此函數傳遞兩個參數,一個是緩沖地址buf,另一個是緩沖的長度size(單位:字節)。該緩沖必須有足夠的長度以容納絕對路徑名再加上一個null終止字符,否則返回出錯。

程序清單4-9 getcwd函數實例

[root@localhost apue]# cat prog4-9.c#include "apue.h"#include <errno.h>#include <limits.h>#ifdef PATH_MAXstatic int pathmax = PATH_MAX;#elsestatic int pathmax = 0;#endif#define SUSV3 200112Lstatic long posix_version = 0;/* If PATH_MAX is indeterminate, no guarantee  this is adequate */#define PATH_MAX_GUESS 1024char *path_alloc(int *sizep);intmain(void){        char *ptr;        int size;        if(chdir("/home/zhu/test") < 0)                err_sys("chdir failed");        ptr = path_alloc(&size);        /* our own function */        if(getcwd(ptr, size) == NULL)                err_sys("getcwd failed");        printf("cwd = %s/n", ptr);        exit(0);}char *path_alloc(int *sizep) /* also return allocated size, if nonull */{        char *ptr;        int size;        if(posix_version == 0)                posix_version = sysconf(_SC_VERSION);        if(pathmax == 0) {   /* first time trough */                errno = 0;                if((pathmax = pathconf("/", _PC_PATH_MAX)) < 0) {                        if(errno == 0)                                pathmax = PATH_MAX_GUESS;  /* it's indeterminate */                        else                                err_sys("pathconf error for _PC_PATH_MAX");                } else {                        pathmax++;    /* add one since it's relative to root */                }        }        if(posix_version < SUSV3)                size = pathmax + 1;        else                size = pathmax;        if((ptr = malloc(size)) == NULL)                err_sys("malloc error for pathname");        if(sizep != NULL)                *sizep = size;        return(ptr);}

當一個應用程序需要在文件系統中返回到其工作的起點時,getcwd函數是有用的。在更換工作目錄之前,我們可以調用getcwd函數先將其保存起來。在完成了處理后,就可以將從getcwd獲得的路徑名作為調用參數傳送給chdir,這樣就返回到了文件系統中的起點。

fchdir函數向我們提供了一種完成此任務的便捷方法。在更換到文件系統中的不同位置前,無需調用getcwd函數,而是使用open打開當前工作目錄(用open可以打開目錄嗎???我嘗試用open打開一個目錄,運行時出現錯誤:open: Is a directory),然后保存文件描述符。當希望回到原工作目錄時,只需簡單地將該文件描述符傳遞給fchdir。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩国产成人在线观看| 欧美性高跟鞋xxxxhd| 欧美在线不卡区| 6080yy精品一区二区三区| 最近中文字幕mv在线一区二区三区四区| 亚洲一区二区日本| 热久久免费国产视频| 国产精品老牛影院在线观看| 精品久久久久久久久中文字幕| 一区二区成人av| 日韩久久午夜影院| 2019中文在线观看| 国内精品国产三级国产在线专| 国产一区二区三区在线观看网站| 久久精品国产视频| 欧美日韩综合视频| 亚洲欧洲一区二区三区在线观看| 欧美伦理91i| 欧美在线一级va免费观看| 奇米成人av国产一区二区三区| 色噜噜亚洲精品中文字幕| 亚洲成人三级在线| 深夜福利91大全| 97在线视频一区| 国产精品久久激情| 亚洲美女视频网站| 91丝袜美腿美女视频网站| 亚洲影院高清在线| 国产精品久久久久免费a∨| 日韩大片免费观看视频播放| 亚洲午夜精品视频| 97精品欧美一区二区三区| 国产精品永久免费在线| 91sa在线看| 亚洲人成在线电影| 久久免费视频在线观看| 色综合天天狠天天透天天伊人| 欧美激情一区二区三区在线视频观看| 欧美电影免费观看大全| 精品国产欧美一区二区三区成人| 欧美日产国产成人免费图片| 亚洲国产精品va在线看黑人动漫| 国产盗摄xxxx视频xxx69| 亚洲人成电影在线观看天堂色| 国产精品揄拍一区二区| 欧美大片免费看| 日本韩国欧美精品大片卡二| 久久综合伊人77777蜜臀| 97超碰蝌蚪网人人做人人爽| 久久精品亚洲精品| 欧美极品欧美精品欧美视频| 亚洲福利视频网站| 在线播放精品一区二区三区| 国内精品久久影院| 国产精品免费看久久久香蕉| 亚洲日本欧美日韩高观看| 激情av一区二区| 亚洲成色777777在线观看影院| 亚洲人成在线观看网站高清| 中文字幕亚洲在线| www.亚洲免费视频| 欧美精品日韩三级| 国产原创欧美精品| 日韩欧美国产一区二区| 亚洲视频欧美视频| 精品久久久久久亚洲国产300| 日韩美女免费线视频| 精品动漫一区二区| 亚洲激情在线视频| 亚洲国语精品自产拍在线观看| 亚洲精品aⅴ中文字幕乱码| 狠狠久久五月精品中文字幕| 久久久久久国产精品久久| 久久久人成影片一区二区三区观看| 成人免费观看网址| 欧美亚洲成人xxx| 在线视频日韩精品| 国产主播欧美精品| 久久国产精品久久久久久久久久| 中文字幕日韩在线观看| 国模私拍视频一区| 国产精品久久999| 久久久人成影片一区二区三区| 亚洲成人性视频| 亚洲一区二区三区四区视频| 成人国产精品久久久久久亚洲| 欧美尺度大的性做爰视频| 久久av在线看| 一本色道久久88精品综合| 77777少妇光屁股久久一区| 欧美性极品xxxx娇小| 中文字幕日韩精品在线| 亚洲精品久久久久国产| 国产成人精品免高潮在线观看| 精品人伦一区二区三区蜜桃免费| 国产一区二区精品丝袜| 亚洲精品综合精品自拍| 69久久夜色精品国产7777| 国产精品嫩草影院一区二区| 国产精品999| 久久久久久18| 日韩视频免费在线| 上原亚衣av一区二区三区| 国产一区二区三区三区在线观看| 日韩高清有码在线| 日韩视频在线免费| 中文字幕精品网| 久久资源免费视频| 97久久久免费福利网址| 神马久久久久久| 国产一区红桃视频| 欧美黄色片视频| 欧美午夜xxx| 亚洲精品视频网上网址在线观看| 久久精品夜夜夜夜夜久久| 久久久国产在线视频| 国产午夜精品理论片a级探花| 91精品国产777在线观看| 国产成人小视频在线观看| 国内精品免费午夜毛片| 亚洲综合日韩在线| 欧美黑人极品猛少妇色xxxxx| xxav国产精品美女主播| 久久精品视频在线观看| 欧美交受高潮1| 国产精品爱久久久久久久| 欧美国产第二页| 日韩a**站在线观看| 国产精品久久二区| 国产中文日韩欧美| 韩日欧美一区二区| 欧美性理论片在线观看片免费| 亚洲女成人图区| 中文字幕在线看视频国产欧美| 18久久久久久| 国产精品福利在线观看网址| 69久久夜色精品国产7777| 久久亚洲综合国产精品99麻豆精品福利| 日韩精品黄色网| 久久成人在线视频| 亚洲激情在线观看视频免费| 国产午夜精品全部视频在线播放| 色噜噜久久综合伊人一本| 久久久久这里只有精品| 国产精品白嫩美女在线观看| 91久久久久久国产精品| 久久国产精品首页| 亚洲性日韩精品一区二区| 国产69精品久久久久久| 韩国精品久久久999| 操人视频在线观看欧美| 欧美猛少妇色xxxxx| 日本高清不卡的在线| 性夜试看影院91社区| 欧美性猛交xxxx免费看| 国产成人在线视频| 91久久精品国产91久久| 98精品在线视频| 日韩免费黄色av| 这里精品视频免费| 欧美在线免费看| 中文字幕亚洲欧美日韩2019| 久久免费视频这里只有精品| 中文字幕亚洲一区二区三区五十路|