linux高级编程补充知识
?
F: 計算機系統結構:
?????-------------------------------
????????????應用程序
???????????-----------------
???????| ?庫函數
?????-------------------------------
????????????系統調用
?????-------------------------------
?????虛擬文件系統 ?| ???進程模塊
?????-(文件模塊)-| ??進程間通信
??????設備文件 ????|
????-------------------------------
?????????? ?硬 件
????-------------------------------
?
?
?
G: 內存結構劃分(32b)/存儲空間分配:
?????用戶空間3G:代碼區,字符串常量區,數據區,堆,棧stack
?????內核空間1G
?
?
?
H: 系統數據文件:
?????/etc/passwd:用戶相關的信息/用戶的數據信息 ?
???????eg:root:x:0:0:root:/root:/bin/bash,用‘:’進行分割
??????????用戶者:密碼占位符:用戶的id:用戶所在組的id:用戶的描述信息:用戶的家目錄:用戶登錄后默認使用的shell(shell 應用程序,作用:命令行解釋器)
?
??
h1: /etc/group:組的相關信息
?????eg:bin:x:1:bin,daemon
?????????組名:組密碼占位符:組id:組成員
?
?
h2: 用戶相關操作:
?????struct passwd *getpwnam(const char *name);
?????struct passwd *getpwuid(uid_t uid);
?
?????struct passwd *getpwent(void);
?????void setpwent(void);//定位到文件開頭,反轉
?????void endpwent(void);
?
?
h3: 組相關操作:
?????struct group *getgrnam(const char *name);
?????struct group *getgrgid(gid_t gid);
?
?
?
I: 啟動例程:
????命令行參數:字符串的處理
????argv----字符串的數組;argv[argc] == NULL
?
?
?
J: 位運算:
?????bit 0/1
?????????& |
?????????00 ?0 0
?????????01 ?0 1
?????????10 ?0 1
?????????11 ?1 1
????一個bit跟0相與& 結果是0;跟1相與&,結果是他本身.
????一個bit跟0相或| 結果是他本身;跟1相或|,結果是1.
?
?
?
K: 設置文件權限(權限的掩碼)
???mode_t umask(mode_t mask);
???系統調用
????permission & ~umask
????regular file 0666 & ~0022
?? ??????0b110 110 110
????0b000 010 010/0b111 101 101 取反做與
????????& 0b110 100 100 ?0644
??linux系統提供的umask命令跟umask()系統調用的作用是一樣的
?
?
k1: int chmod(const char *path, mode_t mode);
????int fchmod(int fd, mode_t mode);
??改變文件的存取許可權限
???linux系統提供的chmod命令跟chmod()系統調用作用是一樣的
?
?
k2: int chown(const char *path, uid_t owner, gid_t group);
????int fchown(int fd, uid_t owner, gid_t group);
????int lchown(const char *path, uid_t owner, gid_t group);
??改變文件的用戶ID uid和組ID gid
???chown 命令改變文件的屬主owner和屬組group
?
?
k3: int truncate(const char *path, off_t length);
????int ftruncate(int fd, off_t length);
??將文件的長度截短為length
???如果當前文件的長度要是小于我們的length,其結果與系統有關.
??將文件截短為0時,它屬于一個特例,與open或creat調用設定O_TRUNC標志是一樣的.
?
?
?
L: 硬鏈接以及硬鏈接的限制條件
????1.堆目錄不能硬鏈接
????2.硬鏈接不能跨文件系統/硬鏈接不能跨磁盤分區
?
?
l1: link 創建硬鏈接
??????int link(const char *oldpath, const char *newpath);
?
????symlink 創建符號鏈接 軟鏈接 快捷方式
??????int symlink(const char *oldpath, const char *newpath);
?
????int unlink(const char *pathname);
??????刪除文件名,有可能會刪除文件(當硬鏈接數/inode里的引用計數為0的時候,會刪除文件)
?
?
?
M: rm remove cd 路徑;rm 文件
????int remove(const char *pathname);
?
?
m1: rename
?????int rename(const char *oldpath, const char *newpath);
?
?
m2: mkdir
?????int mkdir(const char *pathname, mode_t mode);
?
?
m3: rmdir
?????int rmdir(const char *pathname);
????針對空目錄進行刪除.
?
?
?
N: 時間和日期
????time() get time in seconds
????time_t time(time_t *t);
?
???1.出參
???2.返回值
????char *ctime(const time_t *timep);
?????eg: "Wed Jun 30 21:49:08 1993\n"
?
????struct tm *localtime(const time_t *timep); ???返回值是結構體指針
?
????time_t mktime(struct tm *tm);
????char *asctime(const struct tm *tm);
?
?
n1: 時間的字符串表達
????^ ^
????| |asctime
????|
????| struct tm-------->
????| ^ ?|
????|ctime |localtime ?|mktime
????| | ?|
????^---------time_t<---------
????^
????|time
????|
????內核kernel
?
?
?
O: 堆heap
???malloc
???free
???char *ptr;
???char *p;
?????ptr =malloc(1024*sizeof(char));
??....
????p=ptr+512;
?
o1: 元數據 metadata
?????void *realloc(void *ptr, size_t size);//增加空間
?
?
?
P: 前臺/后臺:
????命令 & :表示后臺運行
????fg 后臺進程調入到前臺運行 ?eg:fg %1
bg 前臺進程調入到后臺運行 ?eg:bg %1
????jobs 查看后臺作業/進程
?
?
?
Q: linux如何運行一個程序/如何執行execvp?
????1.將指定的程序/可執行文件加載/復制到調用exec的進程
????2.將給定的字符串數組作為argv傳給這個程序
????3.運行這個程序
?
?
?
R: ?status分為3部分:exit返回值(8b);異常退出號(7b);內核映像(core dump)(1b)
?
?
?
S: 目錄塊/目錄項(inode號和名d_name)
???數據塊
???inode節點表/inode節點數組
?
?
?
T: 自頂向下的程序設計方法 ??????
???分文件:函數數量多的時候,會根據函數的類型分文件
?
???頭文件:宏定義;全局變量的聲明;結構體類型的定義;函數的聲明
?
???分函數:一個函數中代碼數量多的時候,會跟據完成的任務、功能分函數(每個函數的代碼是1-15行)
????分函數通常只做方法處理,數據的輸入和打印輸出通常在主函數中完成
?
?
t1: #include"strcpypt.h" ??// “”----> 當前目錄下優先查找
????#include<string.h> ??// <>----> 在環境變量PATH制定的目錄下優先查找
?
?
t2: #ifndef ??//防止頭文件被重復的包含
?
?
?
U: 服務/客戶:
??????bc----計算器命令(bc----客戶;dc----服務)
??bc是dc的預處理
??bc提供界面處理,使用dc提供的服務,bc是dc的客戶
??bc和dc兩者之間是獨立的程序
??雙向通信
?
?
?
V: 普通文件
???競態文件
???文件鎖/記錄鎖
???fcntl----改變已打開的文件的性質
?加讀數據的鎖
???void set_read_lock(int fd)
???{
??? struct flock lockinfo;
?
lockinfo.l_type = F_RDLCK;
lockinfo.l_whence = SEEK_SET;
lockinfo.l_start = 0;
lockinfo.l_len = 0;
lockinfo.l_pid = getpid();
?
fcntl(fd,F_SETLKW,&lockinfo);
lockinfo.l_type = F_RDLCK;
???}
?
?加寫數據的鎖:
???void set_read_lock(int fd)
???{
??? struct flock lockinfo;
?
lockinfo.l_type = F_WRLCK;
lockinfo.l_whence = SEEK_SET;
lockinfo.l_start = 0;
lockinfo.l_len = 0;
lockinfo.l_pid = getpid();
?
fcntl(fd,F_SETLKW,&lockinfo);
lockinfo.l_type = F_RDLCK;
???}
?
?解鎖:
???void set_read_lock(int fd)
???{
??? struct flock lockinfo;
?
lockinfo.l_type = F_UNLCK;
lockinfo.l_whence = SEEK_SET;
lockinfo.l_start = 0;
lockinfo.l_len = 0;
lockinfo.l_pid = getpid();
?
fcntl(fd,F_SETLKW,&lockinfo);
lockinfo.l_type = F_RDLCK;
???}
?
?
?
W: 函數名---函數的地址/函數的指針
???指針----1,地址 ?2,指針變量
?
?
?
X: 設備文件:
x1: 串口/終端:
??????處理進程和外部設備之間的數據流的內核子程序的集合----被稱為終端驅動程序/tty(TeleTYpe)驅動程序
??
??讀取終端驅動程序的屬性:
???int tcgetattr(int fd, struct termios *termios_p);
??設置終端驅動程序的屬性:
???int tcsetattr(int fd, int optional_actions,const struct termios *termios_p);
?????TCSANOW:立即更新驅動程序的設置
?
??結構體 termios:------------------保存屬性
????tcflag_t c_iflag; ?????/* input modes */-------輸入:驅動程序如何處理從終端來的字符
????tcflag_t c_oflag; ?????/* output modes */-------輸出:驅動程序如何處理流向終端的字符
????tcflag_t c_cflag; ?????/* control modes */--------控制:字符如何被表示(位的個數,停止位等)
????tcflag_t c_lflag; ?????/* local modes */-------本地:驅動程序如何處理來自驅動程序內部的字符
????cc_t ????c_cc[NCCS]; ??/* control chars */
?
=============================================================================================================
書寫步驟:
????????struct termois attribs; ??//保存屬性
????????tcgetattr(fd,&attribs); ??//獲取當前屬性
???//修改:
????????測試位:if(attribs.flagset & MASK)...
置位:attribs.flagset |= MASK;...
清除位:attribs.flagset &|= ~MASK;...
????????tcsetattr(fd,TCSANOW,&attribs); ??//寫回屬性
?-------------------------------------------------------------------------------------------------------------
總結:
????改變終端驅動程序的設置:(Read--Mddify--Write)
????????1.讀取:從驅動程序中獲取當前的屬性 ??
????2.修改:修改所要修改的屬性
????3.寫回:將修改后的屬性去回寫到驅動程序
?-------------------------------------------------------------------------------------------------------------
?===============================================================================================================
轉載于:https://www.cnblogs.com/jfyl1573/p/6250068.html
總結
以上是生活随笔為你收集整理的linux高级编程补充知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言基础(6)-char类型
- 下一篇: Qt 汽车仪表再次编写,Widget,仪