程序間通訊

2021-07-10 09:37:39 字數 2118 閱讀 9715

程序間通訊方式:管道、訊號、訊息佇列、共享記憶體、訊號量、套接字

無名管道:a、只能用於具有親緣關係的程序之間;b、是半雙工的通訊模式;c、可視為特殊的檔案,並不屬於任何檔案系統,並且只存在於核心的記憶體空間

管道只能在具有親緣關係的程序間通訊的原因:通過管道通訊的基本原理本身就是子程序繼承父程序的管道檔案描述符才得以和管道通訊的,故只能在具有親緣關係的程序間通訊。

管道的檔案描述符為fd;其中fd[0]為讀端、fd[1]為寫端

只有在管道的讀端存在時,向管道寫入資料才有效。

向管道寫資料時以阻塞的方式寫入

使用管道時父子程序需要通過同步與互斥機制保證執行先後順序

有名管道:突破了親緣程序間通訊的限制;對有名管道的定位無法使用lseek();操作;對該管道的讀總是從開始處返回資料,對它們的寫則把資料新增到末尾。

建立有名管道需要使用mkfifo();操作是使用open();等檔案操作函式

訊號是在軟體層面對中斷機制的一種軟體模擬,是一種非同步通訊方式

訊號可以直接在使用者空間程序和核心空間程序之間進行互動

訊號的生命週期:訊號產生、訊號在程序中的註冊與登出、執行訊號處理函式

使用者程序對訊號的處理方式:忽略訊號(sigkill、sigstop不可忽略)、捕捉訊號、執行預設操作

傳送訊號的函式有kill();、raise();、alarm();、pause();

sigkill :該訊號用於立即停止乙個程序,且不能夠被忽略、阻塞或處理

sigstop :該訊號用於暫停乙個程序,且不能夠被忽略、阻塞或處理

waitpid();不僅可以用於**子程序;還可以用於得到子程序得到的訊號狀態

signal();主要用於前32種非實時訊號的處理。不支援訊號傳遞資訊。(推薦使用linux更健壯、更新的訊號處理函式sigaction();)

sigkill和sigstop不能被catch和ignore

signal();的作用:捕捉訊號並作相應處理;

訊號進入待處理狀態時程序並不清楚訊號的存在,在訊號集合退出阻塞集合時,未處理訊號被程序作相應的處理

訊號量的生命週期:建立訊號量或獲得系統已存在的訊號量(使用函式semget();)、初始化訊號量(使用函式semctl();)、進行訊號量的pv操作(使用semop();函式)、從系統中刪除訊號量(semctl();的ipc_rmid)

程序間通訊方式中最高效的方式為:共享記憶體

共享記憶體的實現過程:a、建立共享記憶體(使用的函式為shmget();目的是從記憶體中獲得一段共享的記憶體區)、b、對映共享記憶體(使用函式shmat();將具體的共享記憶體對映到相應的程序空間中)c、使用共享記憶體段;

訊息佇列的使用步驟包括:a、建立或開啟訊息佇列;b、新增訊息;c、讀取訊息和控制訊息佇列

訊息佇列中的資訊是存在於核心中的,又佇列id來標識。

27.

單詞查詢:

modifiable:可改變的

describe : 描述

via : 經過

absolute value:絕對值

immediately:馬上

trace : 沿著

provide:提供

patch:修補

delivery:傳遞

integer : 整數

inspect :檢查

consist:由..組成

demonstrate:示例

pause:暫停

monitor:監聽

failure:失敗

convert:轉換

terminate:終止

macro:巨集

disposition 處理

associate :聯絡

invocation:引用

catch:捕捉

initialize:初始化

identity:一致

int atoi(const

char *nptr);/*convert a string

tointeger*/

函式區別:

raise(); and pause();

raise();是程序給自身發乙個signal(存在於signal.h)

pause();是用於將呼叫程序掛起直至捕捉到訊號為止;(存在於unistd.h)

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...

程序間通訊

實現程序間資料共享除了常用的記憶體檔案對映外,對於一些非檔案的資料共享可以直接使用wm copydata。如果需要在程序a傳遞資料到程序b,簡單的實現如下 在程序a中 cstring strdatatosend t hello 需要傳遞的資料 hwnd hwndreceived 程序b的接收資料視窗...

程序間通訊

最近做專案遇到奇怪的問題,我在主線程中建立乙個工作執行緒。在工作執行緒中用sendmessage向主線程傳送訊息,通知主線程操作office 物件。getactiveobject時提示 hr 0x8001010d 因為應用程式正在傳送乙個輸入同步呼叫,所以無法執行傳出的呼叫。我把sendmessag...