百度面試(程序通訊 socket)

2021-07-16 08:42:33 字數 2447 閱讀 3063

1. 

程序間通訊

程序間通訊主要包括管道, 系統ipc(包括訊息佇列,訊號量,共享儲存), socket.

系統ipc的三種方式類同,都是使用了核心裡的識別符號來識別.
匿名管道( pipe ):匿名管道是一種半雙工的通訊方式,通常是在父子程序間使用。
命名管道 (named pipe) :命名管道也是半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。
訊號量( semophore ) : 訊號量是乙個計數器,可以用來控制多個程序對共享資源的訪問。它常作為一種鎖機制,防止某程序正在訪問共享資源時,其他程序也訪問該資源。因此,主要作為程序間以及同一程序內不同執行緒之間的同步手段。
訊息佇列( message queue ) : 訊息佇列是訊息的鍊錶,存放在核心中並由訊息佇列識別符號標識。訊息佇列克服了訊號傳遞資訊少、管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
訊號 ( sinal ) :訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。
共享記憶體( shared memory ) :共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由乙個程序建立,但多個程序都可以訪問。共享記憶體是最快的 ipc 方式,它是針對其他程序間通訊方式執行效率低而專門設計的。它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步和通訊。
套接字( socket ) :套接字也是一種程序間通訊機制,與其他通訊機制不同的是,它可用於不同程序間的程序通訊。
faq1: 

管道與檔案描述符,檔案指標的關係?

答: 其實管道的使用方法與檔案類似,都能使用read,write,open等普通io函式. 管道描述符類似於檔案描述符. 事實上, 管道使用的描述符, 檔案指標和檔案描述符最終都會轉化成系統中socket描述符. 都受到系統核心中socket描述符的限制. 本質上linux核心原始碼中管道是通過空檔案來實現.

faq2: 管道的使用方法?

答: 主要有下面幾種方法: 1)pipe, 建立乙個管道,返回2個管道描述符.通常用於父子程序之間通訊. 2)popen, pclose: 這種方式只返回乙個管道描述符,常用於通訊另一方是stdin or stdout; 3)mkpipe: 命名管道, 在許多程序之間進行互動.

faq3: 管道與系統ipc之間的優劣比較?

答: 管道: 優點是所有的unix實現都支援, 並且在最後乙個訪問管道的程序終止後,管道就被完全刪除;缺陷是管道只允許單向傳輸或者用於父子程序之間.

系統ipc: 優點是功能強大,能在毫不相關程序之間進行通訊; 缺陷是關鍵字key_t使用了核心標識,占用了核心資源,而且只能被顯式刪除,而且不能使用socket的一些機制,例如select,epoll等.

faq4: windos程序間通訊與linux程序間通訊的關係?

答: 事實上,windos的程序通訊大部分移植於unix, windos的剪貼簿,檔案對映等都可從unix程序通訊的共享儲存中找到影子.

faq5: 程序間通訊與執行緒間通訊之間的關係?

答: 因為windows執行的實體是執行緒, 狹義上的程序間通訊其實是指分屬於不同程序的執行緒之間的通訊.而單個程序之間的執行緒同步問題可歸併為一種特殊的程序通訊.它要用到核心支援的系統呼叫來保持執行緒之間同步. 通常用到的一些執行緒同步方法包括:event, mutex, 訊號量semaphore, 臨界區資源等.

2.

關於socket的write和read

首先看這兩個函式原型:

write函式

ssize_t write(int fd,const void*buf,size_t nbytes);

write

函式將buf中的nbytes位元組內容寫入到檔案描述符中,成功返回寫的位元組數,失敗返回-1.並設定errno變數。在網路程式中,當我們向套接字檔案描述舒服寫資料時有兩種可能:

1、write的返回值大於0,表示寫了部分資料或者是全部的資料,這樣用乙個while迴圈不斷的寫入資料,但是迴圈過程中的buf引數和nbytes引數是我們自己來更新的,也就是說,網路程式設計中寫函式是不負責將全部資料寫完之後再返回的,說不定中途就返回了!

2、返回值小於0,此時出錯了,需要根據錯誤型別進行相應的處理。

如果錯誤是eintr表示在寫的時候出現了中斷錯誤,如果是epipe表示網路連線出現了問題。

read函式

ssize_t read(int fd,void*buf,size_t nbyte)

read

函式是負責從fd中讀取內容,當讀取成功時,read返回實際讀取到的位元組數,如果返回值是0,表示已經讀取到檔案的結束了,小於0表示是讀取錯誤。

如果錯誤是eintr表示在寫的時候出現了中斷錯誤,如果是epipe表示網路連線出現了問題。

雖然寫了100個位元組,但並不能保證read一次即讀100個位元組,寫的時候也並非寫100就成功了,write和read實際成功讀寫的位元組數由返回值確定。

百度面試(程序排程 排程演算法)

一 常見的批處理作業排程演算法 1.先來先服務排程演算法 fcfs 就是按照各個作業進入系統的自然次序來排程作業。這種排程演算法的優點是實現簡單,公平。其缺點是沒有考慮到系統中各種資源的綜合使用情況,往往使短作業的使用者不滿意,因為短作業等待處理的時間可能比實際執行時間長得多。2.短作業優先排程演算...

網路 socket 訪問百度

import viewcontroller.h import 沒注釋 import import inte ce viewcontroller property weak,nonatomic iboutlet uitextfield ipadress property weak,nonatomic ...

百度面試小結

首先就是自我介紹啦,接著我們聊到前兩天csdn資料庫被黑導致使用者密碼被盜,然後聯絡到我和同學做的乙個小專案,專案是用php寫的,面試官就問我是怎麼處理使用者登入資訊的,我答用cookie,當然我知道這個很不安全,但是小 只供本校學生使用,就沒有考慮http傳輸時被竊取,當然我資料庫裡面是用md5加...