處理序間通訊(一)

第13章

處理序間通訊(二)

傳遞更多的資料到目前為止我們所用的機制只是簡單的在一個fread或是fwrite中發送或是接收全部的資料。有時我們也許以更小的尺寸發送資料,或是也許我們並不知道輸出的大小。為了避免聲明一個大的緩衝區,我們可以使用多個fread或是fwrite調用並分別處理這些資料。下面是一個程式,popen3.c,由一個管道中讀取所有的資料。實驗--由一個管道讀取大量的資料在這個程式中,我們由一個被調用的ps -alx進程讀取資料。並沒有辦法預Crowdsourced Security

處理序間通訊(三)

管道調用我們已經瞭解了高層的popen函數,現在我們繼續來瞭解低層的pipe函數。這個函數提供了一個在兩個函數之間傳遞資料的方法,而不必調用shell來解釋所請求的命令的。同時他也為我們提供了更多的資料讀寫控制。pipe函數的原型如下:#include <unistd.h>int pipe(int

處理序間通訊(四)

父子進程我們的pipe調用探索的下一步就是使得子進程是與父進程不同的一個程式,而不是運行相同程式的另一個進程。我們可以使用exec調用來完成這個任務。這樣做的一個困難就是通過exec執行的新進程需要知道訪問哪一個檔案描述符。在exec調用之後,就不再是這樣的情況了,因為老進程已經被新的子進程所替代。我們可以通過向exec所執行的新進程傳遞檔案描述符作為參數就可以解決這個問題。要顯示這是如何工作的,我們需要兩個程式。第一個就是資料生產者,他建立管道並且調用子進程,資料消費者。實驗--管道與exec

pku 1057 檔案結構問題

#include <iostream>#include <algorithm>#include <vector>#include <string>using namespace std;string s;struct Directory{string name;vector<Directory> menu;vector<string> files;};void build(Directory& t, string

處理序間通訊(五)

有名管道:FIFO到目前為止,我們只是可以在兩個相關的程式之間傳遞資料,也就是說,由一個共同的祖先進程啟動的程式。通常這並不是十分方便,因為我們希望不相關的進程也可以交換資料。我們可以使用FIFO來實現這個操作,通常稱之為有名管道。一個有名管道是在檔案系統中作為名字存在的一個特殊的檔案類型(記住,在Linux一切皆檔案),但是行為類似於我們已經瞭解的無名管道。我們可以通過命令列或是在一個程式內部建立有名管道。由於曆史原因,用於建立有名管道的命令為mknod:$ mknod filename

處理序間通訊(九)

管道下面是管道實現檔案,pipe_imp.c,其中有用戶端與伺服器端函數。實驗--管道實現標頭檔1 首先是#include:#include "cd_data.h"#include "cliserv.h"2 我們定義一些在此檔案的其他函數中所需要的值:static int server_fd = -1;static pid_t mypid = 0;static char client_pipe_name[PATH_MAX + 1] = {‘/0’};static int client_fd =

POSIX線程-(四)

使用互斥同步在多線程程式中同步訪問的另一個方法就是使用互斥,其作用允許程式鎖住一個對象,從而只有一個線程可以訪問他。要控制對臨界區代碼的訪問,在我們進入這段代碼之前鎖住一個互斥量,並且在我們完成操作時進行解鎖。使用互斥所需要基本函數與訊號量所需要的函數相似,其聲明如下:#include <pthread.h>int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t*mutexattr);int

處理序間通訊(六)

讀取與寫入FIFO使用O_NONBLOCK模式會影響作用在FIFO上的read與write調用的行為。在一個空的阻塞FIFO(例如,沒有使用O_NONBLOCK開啟的)上的read調用將會等待直到有資料可以讀取。相反,在非阻塞且沒有資料的FIFO上進行read調用將會返回0位元組。在一個完全阻塞的FIFO上的write調用將會等待直到資料可以寫入。在一個不能全部接受所有將要寫入資料的FIFO上的write調用將會:如果請求PIPE_BUF位元組或是小於且資料不能寫入時將會失敗。如果請求大於PIP

單鏈表歸併排序

#include <iostream>#include <time.h>#include <cassert>#include <algorithm>#include <map>using namespace std;template <typename T>class List{public: struct Node { Node(const T &val): data(val),

POSIX線程-(五)

線程屬性當我們第一次瞭解線程時,我們並沒有討論區對話屬性的問題。我們現在會進行討論。線程有許多我們可以控制的屬性。然而,在這裡我們只討論那些我們最需要的線程屬性。其他屬性的詳細資料可以在手冊中瞭解到。在所有我們前面的例子中,我們不得不在允許程式退出之前使用pthread_join來重新同步我們的線程。如裡我們希望允許一個線程向建立他的線程返回資料時我們需要這樣做。有時我們並不需要第二個線程向主線程返回資訊,也不希望主線程等待第二個線程。假設我們建立了第二個線程來備份正在編輯的資料檔案的一份拷貝,

處理序間通訊(七)

CD資料庫程式現在我們已經瞭解了我們可以如何使用有名管道來實現一個簡單的用戶端/伺服器系統,我們可以重新查看我們的CD資料庫程式並且進行相應的修改。我們同時組合了一些訊號處理從而允許我們在進程被中斷時進行一些清理動作。我們會使用我們前面的具有一個命令列介面的dbm版本,從而進可能直接的查看代碼。在我們更為詳細的討論新版本的代碼之前,讓我們先編譯這個程式。如果我們有由Web網站所獲得的原始碼,就可以使用makefile來編譯產生server與client程式。輸入server

OOP五原則

 基本原則 封裝變化Encapsulate what varies.面向介面變成而不是實現 Code to an interface rather than to an implementation.優先使用組合而非繼承 Favor Composition Over InheritanceSRP: The single responsibility principle 單一職責系統中的每一個對象都應該只有一個單獨的職責,而所有對象所關注的就是自身職責的完成。Every object in

POSIX線程-(六)

線程屬性-調度下面我們來看一下我們也許希望改變的第二個線程屬性:調度。改變調度屬性與設定分離屬性相類似,但是我們可以使用另外兩個函數來尋找可用的等級層級,sched_get_priority_max與sched_get_priority_min。實驗--調度因為thread6.c是與前面的例子十分類似,這裡我們只看一下其中的區別。1 首先,我們需要一些額外的變數:int max_priority;int min_priority;struct sched_param

TemplateMethod與快速排序

設計模式TemplateMethod模式,快速排序中2種不同的分割演算法#include <iostream>#include <algorithm>#include <time.h>#include <cassert>using namespace std;template <typename T>class AbstractQuickSort{public: void sort(T arr[], int begin, int

處理序間通訊(八)

搜尋資料庫在CD關鍵字上的搜尋比較複雜。函數的使用者希望一旦調用就啟動一個搜尋。我們在第7章通過將在第一次調用上的*first_call_ptr設定為true並且函數返回第一個匹配結果來滿足這種需求。在接下來的搜尋函數調用中,*first_call_ptr設定為false,從而會返回更多的匹配,每次調用返回一個匹配結果。現在我們已經將程式分為兩個進程,我們不能再允許搜尋在伺服器端一次處理一個實體,因為另一個不同的用戶端也許會由伺服器請求一個不同的搜尋,而我們的搜尋仍在處理之中。我們不能使得伺服器

處理序間通訊之共用記憶體

共用記憶體共用記憶體是第二種IPC工具。他允許兩個無關的進程訪問相同的邏輯記憶體。共用記憶體是在兩個啟動並執行程式之間傳遞資料的有效手段。儘管X/Open標準並沒有要求,很可能絕大數的共用記憶體實現都是會將不同進程之間正在共用的記憶體安排在相同的實體記憶體中。共用記憶體為在多個進程之間共用與傳遞資料提供一個有效手段。因為他並沒有提供同步的方法,所以通常我們需要使用其他的機制來同步對共用記憶體的訪問。通常,我們也許會使用共用記憶體來提供對大塊記憶體區的有效訪問,並且傳遞少量的訊息來同步對此記憶體的

Regex 匹配

字串:void ABTR("quint32 ab"){ string s = TR("sky is blue."); obj.foo(TR('rose is red.')); obj.foo(TR('rose is red.")); obj.foo(TR("Mike (Mike Lee)say /"He is hungury/""))} Regex:(?<!/w)(?:TR/()('|")(.*)/1(?:/)) C++ boost:#include

處理序間通訊之訊息佇列

訊息佇列現在我們來討論第三種也是最後一種System V

處理序間通訊應用-CD程式

CD資料庫程式現在我們可以使用我們在這一章所瞭解的IPC工具來修改我們的CD資料庫程式。我們可以使用三種IPC工具的多種不同組,但是因為我們需要傳送的資訊很少,直接使用訊息佇列實現請求的傳遞是一個很明顯的選擇。如果我們需要傳遞的資料量很大,我們可以考慮使用共用記憶體傳遞實際的資料,並且使用訊號量或是訊息來傳遞一個標記通知其他的進程在共用記憶體中有資料可用。訊息佇列介面解決我們了在第11章所遇到的問題,即當資料傳遞時我們需要兩個進程使得管道開啟。使用訊息佇列可以使得一個進程將訊息放入隊列,儘管這個

總頁數: 61357 1 .... 17904 17905 17906 17907 17908 .... 61357 Go to: 前往

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.