LINUX知識整理,linux知識

來源:互聯網
上載者:User

LINUX知識整理,linux知識

Socket():建立通訊端

Bind():綁定通訊端。將一個本地協議地址賦予一個通訊端

Listen():監聽通訊端

Connect():建立與伺服器之間的串連。

accept():接收串連,

Send():發送函數

recv():接收函數

close():關閉串連

伺服器端順序:

Socket(),bind(),listen(),accept(),recv(),close()

用戶端順序:

Socket(),connect(),send(),close()

 

 

socket():建立通訊端,返回一個小整數描述符,以後所有的函數調用就用該描述符來標識這個通訊端。  傳回值小於0,則建立通訊端失敗   AF_XX地址族  PF_XX協議族

socket( int af, int type, int protocol);

af: 一個地址描述。目前僅支援AF_INET格式,也就是說ARPA Internet地址格式。

type: 指定socket類型。新套介面的類型描述類型,如TCP(SOCK_STREAM)和UDP(SOCK_DGRAM)。常用的socket類型   有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等。

protocol: 顧名思義,就是指定協議。套介面所用的協議。如調用者不想指定,可用0。常用的協議有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它們分別對應TCP傳輸協議、UDP傳輸協議、STCP傳輸協議、TIPC傳輸協議。

 

inet_pton():IP地址轉換函式,可以在將IP地址在"點分十進位"和"二進位整數"之間轉換

而且,inet_pton和inet_ntop這2個函數能夠處理ipv4和ipv6。

int inet_pton(int af,const char*src,void*dst);

這個函數轉換字串到網路地址,第一個參數af是地址族,第二個參數*src是來源地址,第三個參數*dst接收轉換後的資料。

inet_pton是inet_addr的擴充,支援的多地址族有下列:

af=AF_INET

src為指向字元型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函數將該地址轉換為in_addr的結構體,並複製在*dst中。

af=AF_INET6

src為指向IPV6的地址,函數將該地址轉換為in6_addr的結構體,並複製在*dst中。

如果函數出錯將返回一個負值,並將errno設定為EAFNOSUPPORT,如果參數af指定的地址族和src格式不對,函數將返回0。

fork():   pid_t fork(void);  在子進程中返回0,在父進程中返回子進程的ID,若出錯返回-1。

Fork在子進程返回0而不是父進程的ID原因是:任何子進程都只有一個父進程,且子進程可以通過調用getppid取得父進程的進程ID。相反,父進程可以有許多子進程,而且無法擷取各個子進程的ID號,如果父進程想要跟蹤所有子進程的進程ID,那麼它必須記錄每次調用fork的傳回值。

會建立一個父進程的副本,兩者同時運行,先後順序不確定

vfork():

1.vfork保證子進程先運行,在它調用exec或exit之後父進程才可能被調度運行。如果在調用這兩個函數之前子進程依賴於父進程的進一步動作,則會導致死結。

2.fork要拷貝父進程的進程環境;而vfork則不需要完全拷貝父進程的進程環境,在子進程沒有調用exec和exit之前,子進程與父進程共用進程環境,相當於線程的概念,此時父進程阻塞等待。

為什麼會有vfork呢?

因為以前的fork當它建立一個子進程時,將會建立一個新的地址空間,並且拷貝父進程的資源,然後將會有兩種行為:

1.執行從父進程那裡拷貝過來的程式碼片段

2.調用一個exec執行一個新的程式碼片段

當進程調用exec函數時,一個新程式替換了當前進程的本文,資料,堆和棧段。這樣,前面的拷貝工作就是白費力氣了,這種情況下,聰明的人就想出了vfork。vfork並不複製父進程的進程環境,子進程在父進程的地址空間中運行,所以子進程不能進行寫操作,並且在兒子“霸佔”著老子的房子時候,要委屈老子一下了,讓他在外面歇著(阻塞),一旦兒子執行了exec或者exit後,相當於兒子買了自己的房子了,這時候就相當於分家了。

因此,如果建立子進程是為了調用exec執行一個新的程式的時候,就應該使用vfork

 

線程:一個程式至少有一個進程,一個進程至少有一個線程。

線程是進程的一個實體,是CPU進行調度的最小單位。

幾個函數:

pthread_mutex_lock(&mutex);          //加鎖
pthread_mutex_unlock(&mutex);          //釋放鎖
pthread_cond_wait(&cond, &mutex);    //條件等待  進入此語句將加鎖進行釋放
pthread_cond_signal(&cond);          //啟用條件
pthread_cond_broadcast(&cond);       //   廣播    啟用所有滿足此條件的
pthread_create(&tid[i-1], NULL, thread_fun, &i);   //建立線程
pthread_join(tid[i], NULL);           //等待線程結束

 

線程的同步與互斥

多線程共用一個進程的地址空間雖然線程間通訊容易進行,但是多線程同時訪問共用對象時需要引入同步和互斥機制。
同步指的是多個任務按照約定的順序相互配合完成一件事情,dijkstra基於訊號量的概念提出了一種同步機制。由訊號量來決定線程是繼續運行還是阻塞等待。

線程間的互斥,引入互斥鎖的目的是用來保證共用資源資料操作的完整性。
互斥鎖主要用來保護臨界資源
每個鄰居資源都由一個互斥鎖來保護,任何時刻最多隻能有一個線程能訪問該資源。

線程必須先獲得互斥鎖才能訪問臨界資源,訪問完臨界資源後釋放該鎖。如果無法獲得鎖,線程會阻塞知道獲得鎖為止。

互斥鎖和條件變數實現讀寫鎖:讀寫鎖的讀和寫是互斥的,讀的時候不能寫,寫的時候不能讀,但如果實現讀寫鎖的話,首先要確定的的是讀優先還是寫優先。還有就是讀進程可以共存,寫進程則完全互斥。如果有進程需要寫時,要申請寫鎖,但如果在申請寫鎖的時候發現有其他進程正在寫或者正在讀,則進行等待,一直等到讀鎖或寫鎖完全釋放為止。讀進程在讀取時先申請讀鎖,若此時有寫進程,則進行等待,一直等到寫鎖釋放後在進行讀。

 

 

OSI七層模型:

7:應用程式層

6:展示層

5:會話層       

4:傳輸層

3:網路層       

2:資料連結層

1:物理層

網際網協議族:

應用程式層      :OSI的567

TCP |UDP    :OSI的4    網路層可直接繞或傳輸層直接使用IPV4或IPV6

IPV4、IPV6   :OSI的3

裝置驅動程式和硬體   :OSI的12

 UDP:簡單的、不可靠的資料報協議。非串連的協議,傳輸資料之前源端和終端不建立串連,當它想傳據的速度僅僅是受送時就簡單地去抓取來自應用程式的資料,並儘可能快地把它扔到網路上。在發送端,UDP傳送數應用程式產生資料的速度、電腦的能力和傳輸頻寬的限制;在接收端,UDP把每個訊息段放在隊列中,應用程式每次從隊列中讀一個訊息段。

TCP:複雜的可靠地位元組流協議。是連線導向的協議,也就是說,在收發資料前,必須和對方建立可靠的串連。三向交握四次揮手

三向交握

1)第一次握手:建立串連時,用戶端A發送SYN包(SYN=j)到伺服器B,並進入SYN_SEND狀態,等待伺服器B確認。

(2)第二次握手:伺服器B收到SYN包,必須確認客戶A的SYN(ACK=j+1),同時自己也發送一個SYN包(SYN=k),即SYN+ACK包,此時伺服器B進入SYN_RECV狀態。

(3)第三向交握:用戶端A收到伺服器B的SYN+ACK包,向伺服器B發送確認包ACK(ACK=k+1),此包發送完畢,用戶端A和伺服器B進入ESTABLISHED狀態,完成三向交握。

完成三向交握,用戶端與伺服器開始傳送資料。

四次揮手

(1)用戶端A發送一個FIN,用來關閉客戶A到伺服器B的資料傳送。 

(2)伺服器B收到這個FIN,它發回一個ACK,確認序號為收到的序號加1。和SYN一樣,一個FIN將佔用一個序號。 

(3)伺服器B關閉與用戶端A的串連,發送一個FIN給用戶端A。 

(4)用戶端A發回ACK報文確認,並將確認序號設定為收到序號加1。 

小結TCP與UDP的區別:
1.基於串連與無串連;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程式結構較簡單;
4.流模式與資料報模式 ;
5.TCP保證資料正確性,UDP可能丟包,TCP保證資料順序,UDP不保證。

SCTP:流量控制傳輸協議,可靠地

 

 

進程間的幾種通訊方式:

# 管道( pipe ):管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的進程間使用。進程的親緣關係通常是指父子進程關係。
# 有名管道 (named pipe) : 有名管道也是半雙工的通訊方式,但是它允許無親緣關係進程間的通訊。

# 訊號 ( sinal ) : 訊號是一種比較複雜的通訊方式,用於通知接收進程某個事件已經發生。
# 訊號量( semophore ) : 訊號量是一個計數器,可以用來控制多個進程對共用資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共用資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
# 訊息佇列( message queue ) : 訊息佇列是由訊息的鏈表,存放在核心中並由訊息佇列標識符標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
# 共用記憶體( shared memory ) :共用記憶體就是映射一段能被其他進程所訪問的記憶體,這段共用記憶體由一個進程建立,但多個進程都可以訪問。共用記憶體是最快的 IPC 方式,它是針對其他處理序間通訊方式運行效率低而專門設計的。它往往與其他通訊機制,如訊號量,配合使用,來實現進程間的同步和通訊。
# 通訊端( socket ) : 套解字也是一種處理序間通訊機制,與其他通訊機制不同的是,它可用於不同機器間的進程通訊。

 

 

LINUX基本命令:

ls 顯示檔案 -l 詳細資料

-a 所有檔案,包括隱藏

mkdir 建立目錄

cd 切換目錄

touch 建立空檔案

echo 建立帶有內容的檔案

cat 查看檔案內容

cp 拷貝 (源檔案 目的檔案)

mv 移動或重新命名

rm 刪除檔案

-r 可刪除子目錄及檔案

-f 強制移除

rmdir 刪除空目錄

find 在檔案系統搜尋某檔案

wc 統計文本中行數、字數、字元數

grep 在文字檔中尋找某字串

pwd 顯示目前的目錄

ln 建立連結檔案

系統管理命令

stat 顯示指定檔案的詳細資料 比ls更詳細

ps 顯示瞬間進程狀態

ifconfig 查看網路情況

ping 測試網路聯通

clear 清屏

kill 殺死進程

chown 更改所有者或使用者組

chmod 變更檔許可權 讀寫執行

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.