日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux应用之----进程通信

發布時間:2023/12/15 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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应用之----进程通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。