Linux高階程式設計知識點(1)

2021-07-10 15:27:54 字數 4026 閱讀 2752

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...