一、無名管道
- 無名管道時半雙工的,就是對於乙個管道來講,只能讀或者寫
- 無名管道只能在相關、有共同祖先的程序間使用
- 乙個fork或者exec呼叫建立的子程序繼承了父程序的檔案描述符
1,開啟和關閉管道
int pipe(int filedes[2]);
//在你從乙個管道中讀寫,管道必須存在
//如果成功建立管道,則會開啟兩個檔案描述符,並把它們的值儲存在乙個數值
//第乙個檔案描述符用於讀資料,第二個檔案描述符用於寫資料
//出錯返回-1,同時設定errno
//關閉乙個管道用close()函式
//不能兩端進行讀寫
/*讀寫無名管道例子*/
int main()
close(fd[0]);
}else
return0;}
二、有名管道(fifo)
- 有名管道是持久穩定的
- 它們存在於檔案系統中
- 可以讓無關聯的程序之間通訊
1,用shell命令建立有名管道mkfifo [option] name
#mkfifo fifo1 //建立乙個有名管道
#cat < fifo1 //通過cat向管道讀取資料
#ls > fifo1 //通過ls向管道輸出資料
2,函式建立fifo
int mkfifo(const
char *pathname,mode_t mode)
//函式執行成功返回0,否則返回-1,並設定變數errno
int unlink(const
char*pathname)
//刪除fifo檔案,執行成功返回0,否則返回-1,並設定變數errno
int main()
3,讀寫fifo檔案
//讀fifo例子
int main()
close(fd);
return0;}
//寫fifo例子
int main()
close(fd);
return0;}
4,共享記憶體
- 共享記憶體是核心處於在多個程序之間交換
資訊二留出的一塊記憶體區
- 如果段的許可權設定恰當,每個要訪問該段
記憶體的程序都可以把它映像到自己的私有空間
- 如果乙個程序更新了段中的資料,其他程序也
會立即看到更新
- 由乙個程序建立的段,也可以由另乙個程序讀寫
- 每個程序都把自己對共享程序記憶體的映像放到自
己的記憶體空間
1)建立共享記憶體區
#include
#include
int shmget(key_t key,size_t size,int shm_***);
//引數key既可以是ipc_private,也可以是ftok函式返回的乙個關鍵字
//引數size指定段的大小。
//引數flag:八進位制數,0***。轉化為二進位制許可權
//shmget成功返回段標示符,失敗返回-1。
int shmctl(id, ipc_rmid, 0);
//刪除共享記憶體的函式
/*建立共享記憶體區*/
int main()
2)附加共享記憶體區
void *shmat (int shmid,const
void *shmaddr,int shmfg );
//引數shmid是要附加的共享記憶體標示符
//總是把引數shmaddr設定為0
//引數shm***可以為shm_rdonly,這意味著附加段是唯讀
int shmdt (const
void *shmaddr );
/*附加,釋放共享記憶體區*/
int main(int argc,char *args)
return0;}
3)讀寫共享記憶體區
/*附加,釋放共享記憶體區*/
int main(int argc,char *args)
if(atoi(args[2] == 2)//read shared mem
shmdt(shmbuf);
}return
0;}
Linux程序間通訊
程序間通訊 ipc interprocess communication 基本機制 訊號 管道及命名管道 訊息佇列 共享主存 訊號量 套接字。訊號 全稱軟中斷訊號,是在軟體層次上對中斷機制的一種模擬,它也是程序間通訊機制中唯一的非同步通訊機制。linux訊號處理函式可分為訊號安裝函式 訊號傳送函式和...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...
Linux程序間通訊
謝謝nonoob糾錯 我們在linux訊號基礎中已經說明,訊號可以看作一種粗糙的程序間通訊 ipc,interprocess communication 的方式,用以向程序封閉的記憶體空間傳遞資訊。為了讓程序間傳遞更多的資訊量,我們需要其他的程序間通訊方式。這些程序間通訊方式可以分為兩種 1.管道與...