echostate.c
&setecho.c
:
tcgetattr(int fd, & termios info)函數
:用於獲取和終端相關的參數賦給infotcsetattr(int fd, int actions,&termios info)
:設置與終端相關的參數,actions參數決定修改何時生效,TCSANOW爲改變當即發生結構體termios
:是在POSIX規範中定義的標準接口,用於存儲一些和終端接口相關的信息man -k terminal|grep set|grep 1
能夠找到系統自帶的設置終端屬性命令stty
,stty echo
即打開echo.stty -echo
關閉echoc_lflag
、c_lflag|ECHO
和c_lflag&~ECHO
的值的變化,編寫一個echotest將三者值輸出出來,當echo打開時三者值以下:
可見不管echo是打開仍是關閉,c_lflag|ECHO
和c_lflag&~ECHO
的值始終沒有改變,不過具體緣由尚未想清楚,要繼續查詢或者GDB調試或許能更清楚具體是怎麼變化的node
filesize
&fileinfo
:
stat結構體具體以下:linux
struct stat { mode_t st_mode; //文件訪問權限 ino_t st_ino; //索引節點號 dev_t st_dev; //文件使用的設備號 dev_t st_rdev; //設備文件的設備號 nlink_t st_nlink; //文件的硬鏈接數 uid_t st_uid; //全部者用戶識別號 gid_t st_gid; //組識別號 off_t st_size; //以字節爲單位的文件容量 time_t st_atime; //最後一次訪問該文件的時間 time_t st_mtime; //最後一次修改該文件的時間 time_t st_ctime;//最後一次改變該文件狀態的時間 blksize_t st_blksize; //包含該文件的磁盤塊的大小 blkcnt_t st_blocks; //該文件所佔的磁盤塊 };
filesize.c
中顯示的文件時間是直接輸出st_mtime是系統時間,對於用戶來講並不友好,可是能夠調用函數ctime(),將輸出模式改爲用戶友好的年月日(localtime()能夠將其修改爲對應中文格式)ls1.c
&ls2.c
linux ls
命令中還涉及目錄的操做,因此除了stat結構體以外,還須要用到目錄相關的結構體DIR
&dirent
DIR
結構體以下:ios
struct __dirstream { void *__fd; char *__data; int __entry_data; char *__ptr; int __entry_ptr; size_t __allocation; size_t __size; __libc_lock_define (, __lock) };
dirent
結構體以下:安全
struct dirent { long d_ino; /* 索引節點號 */ off_t d_off; /* 在目錄文件中的偏移 */ unsigned short d_reclen; /* 文件名長 */ unsigned char d_type; /*文件類型 */ char d_name [NAME_MAX+1]; /*文件名 */ }
經過DIR *opendir(const char *filename)
和dirent *readdir(DIR *dirp)
等目錄相關函數取得相應數據輸出便可(opendir()對應記得closedir(),目錄的打開,讀取能夠類比c語言中FILE的打開,讀取,這也從側面體現了在linux系統中一切都是以文件的形式來管理的)函數
spwd.c
spwd.c
要輸出當前的工做路徑,因此在編寫的總體思路上採用一種循環調用的思路:
get_inode函數
&printpathto函數
&inum_to_name函數
get_inode()
printpaththo()
ui
void printpathto( ino_t this_inode ) { ino_t my_inode ; char its_name[BUFSIZ]; if ( get_inode("..") != this_inode ) { chdir( ".." ); /*切換至父目錄*/ inum_to_name(this_inode,its_name,BUFSIZ); my_inode = get_inode( "." ); printpathto( my_inode ); printf("/%s", its_name ); } }
chdir(..)
即切換至其父目錄的函數inum_to_name()