linux应用之----进程通信
進程間通信基礎
進程間通信的英文縮寫:?IPC?
為什么需要進程間通信?數據傳輸,資源共享,通知事件,進程控制等。
Linux進程間通信方式(6種):管道,信號,消息隊列,共享內存,信號量,套接字。
各種進程間通信方式詳解
????1?:管道通信
????????????????int?pipe?(int?name[2])
????1):成功返回0;失敗返回-1;
????2):用于父進程與子進程之間的通信。執行了該函數后,相當于打開了兩個文件,一個文件描述符為name[0],另一個為name[1];若要往該管道中寫入數據,應該關閉name[0];往name[1]中寫數據;要從管道讀取數據,關閉name[1];從name[0]中讀取即可
????
2?有名管道函數
????????????????int??mkfifo?(const?char?*path,?mode_t?mode)
1):表頭文件?sys/types.h;?sys/stat.h。
2):mode模式。同文件的創建模式。
3):若成功則返回0,否則返回-1。
3?:信號通信
簡介:信號通信是unix系統最為古老的通信方式。能產生信號的方法有硬件和
軟件兩種。硬件諸如:按鍵,除數為0,訪問無效存儲空間等。軟件產生的信號主要是通過命令或函數。
軟件產生信號的方法,最重要的是kill函數和kill命令。另外還有raise函數,alarm函數。
信號的種類非常繁多,并且都是以宏定義的形式呈現,都是一些整形常量。常見的信號:SIGKILL(該信號結束接收該信號的進程),SIGINT(來自鍵盤的中斷信號ctrl+c),SIGSTOP(來自鍵盤ctrl+z或者調試程序的停止執行信號)。
kill函數:??int?kill(pid_t?pid?,?int?signo)。
raise函數???int?raise(int?signo)。
Alarm函數???int?alarm(unsigned?int?seconds)。該函數在設定時間后,產生一個SIGALARM信號,如果不捕捉該信號,則默認動作是終止該進程。
pause函數。?Int?pause(void)。該函數使調用進程掛起,直至捕捉到一個信號。
信號的處理。調用函數signal。原型不容易理解,直接給出一個例子:
signal(SIGINT,?my_func);?此處的myfunc函數時自己定義的一個處理SIGINT信號函數。
4:消息隊列通信
簡介:unix古老的兩種通信方式信號通信和管道通信都有其缺陷。信號通信傳輸
的信息量有限,而管道通信則只能傳送無格式的字節流。消息隊列則則克服了上面的缺陷。
頭文件:#include?<sys/types.h>
???????#include?<sys/ipc.h>
? 應用舉例:首先定義一個數據結構,第一個成員必須是整形,或者長整形。它的作用是把信息做一個標識。寫進去的信息如果是用100表示,那么讀的時候也必須帶上參數100,才能從消息隊列中讀出這條信息。
struct?msg_buf
????{
???????int?mtype;
???????char?data[255];
};
key_t?ftok(char?*pathname?,?char?pro);?pro只要不為0即可
msgid=msgget(key,IPC_CREAT|0666);
ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),IPC_NOWAIT);
ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),mtype值,IPC_NOWAIT)
5:信號量
簡介:與其它的通信方式不同,信號量主要是用于保護臨界資源。進程可以根據它判定是否能夠訪問某些共享資源。
分類:二值信號燈和計數信號燈。
6:共享內存
產生共享內存:??????shm_id=shmget(鍵值,?大小,讀寫權限)?;????為了防止輸入的具體鍵值可能已經被占用,可以使用宏IPC_PRIVATE。來重新新建一塊共享內存,它會自動使用新的鍵值。鍵值通常用IPC_PRIVATE.?讀寫權限用S_IRUSR|S_IWUSR
映射共享內存:?一個具體的例子:
????????????????????c_addr?=?shmat(shmid,0,0);
其中shmid是由shmget得到的,第二個0,表示映射到應用程序的共享內存的起始位置。第三個參數不是很明白。
總結
以上是生活随笔為你收集整理的linux应用之----进程通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平安金管家是合法的吗 平安金管家是正规平
- 下一篇: 跳一跳高分技巧有哪些