linux高階程式設計(1)
unix/linux系統江湖傳言:
「檔案之才,得之可得天下
」,這也是採用檔案系統管理硬體裝置的原因。之前的linux基礎篇主要是了解linux的基礎命令和工作原理;而高階篇涉及到socket程序通訊等重要的知識,話不多說,一起去挖寶吧!
1.裝置和檔案
linux採用檔案系統管理硬體裝置,我們可以把所有的硬體裝置看做是特殊的檔案,實現裝置無關性。
(1)裝置和檔案操作方式:
系統api
vs系統呼叫:
系統api:系統一般都有乙個庫libc ,程式設計師都是呼叫庫檔案來和核心打交道的
系統呼叫:作業系統提供給使用者的特殊介面(實際上是以軟中斷的方式向核心請求)。
裝置驅動程式會使用一些標準的核心服務,應用程式通常可以通過系統呼叫open()開啟裝置檔案,建立起與目標裝置的連線;對檔案的訪問相當於對裝置的使用;而我們知道裝置驅動程式是核心的一部分(皇帝身邊的紅人)
,驅動必須要提供乙個標準的介面(比如:我們最後階段移植驅動的時候,一般都會加乙個test.c檔案,執行test.c實際上呼叫的也是驅動裡面的介面函式),驅動模組呼叫read /write 操作 硬體;
檔案描述符
fd: pcb(程序管理塊)中有檔案描述符指標,記錄的是每個程序的檔案描述符列表,核心比較高傲,處於資料保護,不允許外人訪問檔案描述符表,只給外人提供乙個檔案描述符的id而且還限制了訪問的個數,這樣 應用程式就可以通過這個檔案描述符id來訪問核心的檔案;通過#ulimit –n 來檢視檔案描述符;
當每個程序載入後,預設開啟 0,1,2這三個檔案描述符。
檔案描述符如此好用,實乃居家旅行,殺人mei口,必備良藥,那麼問題來了,怎麼獲得這個檔案描述符?
客官往下看:
open/creat
函式:(開啟或者有可能建立乙個檔案)
int open(constchar *pathname, int flags);
int open(constchar *pathname, int flags, mode_t mode);
int creat(constchar *pathname, mode_t mode);
*creat(pathname, mode)等價於open(pathname,o_wronly|o_creat|o_trunc, mode)
返回值:成功時返回檔案的描述符,失敗時返回-1
eg: outfd= open(「myfile",o_wronly|o_creat|o_trunc,s_irwxu|s_irgrp);
close
函式:
#include
int close(intfd);
返回值:成功則返回0,失敗則返回1
read/write
函式:
#include
ssize_t read(intfd, void *buf, size_t count);
返回值: 讀到的位元組數,若已到檔案尾為0,若出錯為-1
ssize_twrite(int fd, const void *buf, size_t count);
返回值: 若成功為已寫的位元組數,若出錯為-1
fcntl
函式:對指定的描述符對應的檔案進行操作(經常用於檔案鎖)
int fcntl(intfd, int cmd);
int fcntl(intfd, int cmd, long arg);
int fcntl(intfd, int cmd, struct flock *lock);
返回值: 若成功則依賴於cmd,若出錯為-1
f_dupfd: 用來查詢大於或等於引數arg的最小且仍未使用的檔案描述詞,並且複製引數fd的檔案描述詞。
f_getfd/f_setfd:取得/設定close-on-exec旗標。
f_getfl/f_setfl:取得/設定檔案描述詞狀態旗標
f_getown/f_setown:管理可用的i/o訊號
f_getlk/f_setlk/f_setlkw:取得/設定檔案鎖定的狀態,後者若連線斷開則直接錯誤返回
lseek
函式:是用於在指定的檔案描述符中將檔案指標定位到相應的位置。
off_tlseek(int fildes, off_t offset, int whence);
引數whence:
seek_set: 從檔案開頭計算偏移量
seek_cur: 從檔案當前的位置開始計算偏移量
seek_end: 從檔案結尾的位置開始計算偏移量chmod修改許可權:int chmod (char *pathname,mode_t mode)
dup/dup2
函式:複製檔案描述符
*檔案描述符在形式上是乙個非負整數。實際上,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。
dup返回新的檔案檔案描述符(沒有用的檔案描述符最小的編號)。
dup2可以讓使用者指定返回的檔案描述符的值,如果需要,則首先接近newfd的值,他通常用來重新開啟或者重定向乙個檔案描述符。
#include
int dup(int oldfd);
int dup2(int oldfd, int newfd);
返回值:成功則返回檔案新的描述符,失敗則返回-1
許可權位設定為
mode: int mkdir(char *pathname,mode_t mode)
檔案記錄鎖:多個程序同時對同一檔案進行操作,出現資料不同步,於是用fcntl函式對檔案進行控制;
tty終端:
串列埠終端(/dev/ttysn);
偽終端(/dev/pty/);
控制終端(/dev/tty);
控制台終端(/dev/ttyn,/dev/console);
虛擬終端(/dev/pts/n);
tty裝置包括虛擬控制台,串列埠以及偽終端裝置。
/dev/tty代表當前tty裝置,在當前的終端中輸入 echo 「hello」 > /dev/tty ,都會直接顯示在當前的終端中。
串列埠程式設計:
在嵌入式中串列埠是字裝置,訪問具體的串列埠的程式設計與讀/寫檔案的操作類似,只需開啟相應的裝置檔案即可操作。串列埠程式設計在於引數與屬性的設定。根檔案中若沒有串列埠裝置檔案,應使用mknod命令建立;
eg: mknod /dev/ttys0 c 3 23 (這個在開發板上移植驅動的時候使用過)
串列埠通訊方式:
ø 同步通訊:時鐘保持一致;
ø 非同步通訊:時鐘頻率可以不一樣;
ø 全雙工:收發同時進行;
ø 半雙工:收發分開進行;
串列埠db9針腳:
rxd:接收
txd:傳送
gnd:接地
其他(其他針腳可以做檢測用):
舉個栗子:如何檢視串列埠裝置有沒有連線?
用rts傳送乙個資料,看cts有沒有收到,這樣就可以確定裝置的連線狀況。
串列埠設定:
ø 流控制:軟體流和硬體流
ø 波特率:傳輸速度
ø 資料位:通常設8位
ø 奇偶校驗:校驗資料
ø 停止位:通常設1位
C 高階程式設計知識點
一.繼承中基類和子類的特徵 1.c 不支援多重繼承,支援多重介面繼承 2.c 子類只有乙個基類,乙個父類可以有多個子類 3.不允許迴圈繼承 相互繼承 4.繼承可以個隔代繼承 5.子類可以繼承父類的可繼承屬性和函式 6.繼承只能單繼承 二.繼承和封裝的定義 1.繼承 繼承允許我們通過乙個類定義另乙個類...
Linux程式設計知識點彙總
shell 是指linux的使用者介面,使用者通過這個介面訪問作業系統核心的服務。shell也是一種解釋型程式語言。常見的shell種類 linux作為伺服器的作業系統的優勢 linux檔案系統是分層樹型結構,在根目錄 下有許多子目錄,比如 通過chmod命令可以修改許可權。命令功能 ls顯示當前目...
LINUX常用知識點(1)
u g o 使用者 組內使用者 其他使用者 檔案許可權 r 讀 4 w 寫 2 x 可執行 1 組外成員o的許可權為唯讀 r 4 所有者a全部許可權 rwx 7 組內g的許可權讀與寫 rw 6 route route命令是在本地ip路由器中顯示和修改條目網路命令,修改路由的命令 tracert tr...