APUE中ttyname的遞迴實現

2021-07-22 01:53:39 字數 2204 閱讀 7424

ttyname給定指定檔案描述符上開啟的終端裝置的路經名,在apue(中文第三版p564-565)中有乙個非遞迴的實現,花了兩個多小時的時間搞懂,現在把關鍵的**寫上注釋。在最後會有乙個本人改寫的遞迴實現。

源**:

#include 

#include

#include

#include

#include

#include

#include

struct devdir ;

static

struct devdir *head;

static

struct devdir *tail;

static

char pathname[_posix_path_max + 1];

static

void

add(char *dirname)

ddp->d_next = null;

if (tail == null) else

}static

void

cleanup(void)

head = null;

tail = null;

}static

char *

searchdir(char *dirname, struct stat *fdstatp)

if (devstat.st_ino == fdstatp->st_ino &&

devstat.st_dev == fdstatp->st_dev)

}closedir(dp);

return(null);

}char *

ttyname(int fd)

cleanup();

return(rval);

}

add這個函式的作用是建立單向鍊錶,鍊錶中有兩個指標,乙個指向下乙個節點,乙個指向目錄名所在的記憶體區域,這塊記憶體是由strdup呼叫malloc建立的,每當遇到乙個目錄,searchdir就會呼叫add將這個目錄名儲存在節點中d_name指標所指的記憶體中。

ttyname這一部分本人感到比較難以理解,開始不清楚怎樣做到遍歷/dev的。其實第一次呼叫searchdir找出了/dev下的所有目錄,然後進行while迴圈,就是在這個迴圈中,鍊錶長度會發生變化,而不是第一次searchdir後的長度,感覺這裡正是整個程式最關鍵的技巧。比如,第一次的鍊錶為:/dev/dir1–/dev/dir2–/dev/dir3–null,然後從dir1開始查詢,如果遇到目錄,就會變成/dev/dir1–/dev/dir/2–/dev/dir3–/dev/dir1/dir11/–/dev/dir1/dir12–/dev/dir1/dir13–null,依次類推,就是逐個節點查詢,遇到目錄就在在尾部插入節點,所以呼叫searchdir的次數就不是確定的,與整個/dev下的目錄數有關,開始的時候我就以為呼叫的次數就是第一次呼叫searchdir建立鍊錶的節點樹,可是這樣做不到遍歷整個檔案樹啊,就卡住了。

下面是自己寫的遞迴查詢的版本:

#include 

#include

#include

#include

#include

#include

#include

static

char pathname[_posix_path_max + 1];

char *

searchdir( char *dirname, struct stat *fdstatp)

else

if ( s_ischr(statbuf.st_mode))}}

closedir(dp);

return null;

}char *

my_ttyname( int fd)

intmain(void)

else

name = "not a tty";

printf("fd=0: %s\n",name);

if (isatty(1))else

name = "not a tty";

printf("fd=1: %s\n",name);

if (isatty(2))else

name = "not a tty";

printf("fd=2: %s\n",name);

return

0;}

APUE 執行緒同步屬性與遞迴鎖

參考文件1 參考文件2 遞迴鎖值得注意的兩個屬性是程序共享屬性和型別屬性 include intpthread mutexattr init pthread mutexattr t attr int pthread mutexattr destroy pthread mutexattr t attr...

APUE 程序控制 中

當乙個程序正常或異常終止時會向父程序傳送sigchld訊號。對於這種訊號系統缺省會忽略。呼叫wait waidpid的程序可能會 include include pid t wait int statloc pid t waitpid pid t pid,int statloc,int option...

APUE 檔案和目錄 中

乙個檔案可以有多個目錄項指向其i節點。使用link函式可以建立乙個指向現存盤案連線 include int link const char existingpath,const char newpath 返回值 成功為0,出錯為 1 該函式建立乙個新目錄項newpath,指向現存盤案existing...