【Linux】進程間通訊方式

管道

  • 有名管道:在磁盤上有一個文件標識,創建管道文件,但是交互的數據並不會存儲到磁盤中,管道文件不會佔據磁盤空間。有名管道沒有在磁盤上存真正的信息,而是在內存中存放,2個進程結束後自動丟失,通信結束後有名管道的文件路徑本身存在,這是和無名管道區別的地方。
  • 無名管道:首先創建一個管道文件,無名管道是一種特殊類型的文件,在內核空間中對應的資源即是一段內存空間,內核在這段空間以循環對列的方式臨時存入一個進程發送給另一個進程的信息,這段內核空間完全由操作系統管理和維護,應用程序只需要,也只能通過系統調用來訪它。
//無名管道代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>

int main()
{
	int fds[2] = {-1, -1};
	
	int res = pipe(fds);  //創建管道, fds[0]  讀端    fds[1] 寫端
	assert(-1 != res);

	pid_t n = fork();
	assert(-1 != n);

	if(0 == n) //子進程負責讀,所以要關閉寫端
	{
		close(fds[1]);
		while(1)
		{
			char readbuff[128] = { 0 };
			int n = read(fds[0], readbuff, 127);

			if(n < 0 || 0 == strncmp(readbuff, "end", 3))
			{
				break;
			}
			printf("child: %s\n", readbuff);
		}
		close(fds[0]);
	}
	else  //父進程負責寫,因此要先關閉讀端
	{
		close(fds[0]);
		while(1)
		{
			printf("plese input\n");
			char writebuff[128] = { 0 };
			fgets(writebuff, 128, stdin);
			
			write(fds[1], writebuff, strlen(writebuff) - 1);
			if(0 == strncmp(writebuff, "end", 3))
			{
				break;
			}
		}
		close(fds[1]);
	}
	return 0;
}

信號

信號量

信號量類似於一個計數器,當信號量的值大於0時,記錄臨界資源的個數,當信號量等於時,進程訪問臨界資源時必須阻塞。

消息隊列

共享內存

共享內存是通過內核對象,將多個進程中的一個虛擬地址映射到內核對象所申請的一塊物理內存上,從而實現進程間數據的通訊。
如圖所示:

  • 步驟:
    1. 創建內核對象,並且申請物理內存。
    2. 鏈接,即各進程通過虛擬地址映射到同一物理內存上。
    3. 通過ptra,ptrb分別訪問這塊物理內存。

socket套接字

socket通過TCP傳輸,UDP傳輸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章