進(jìn)程間的通信
進(jìn)程間通信(IPC,Interprocess Communication)是指在不同進(jìn)程之間傳輸數(shù)據(jù)和交換信息的一種機(jī)制。它允許多個進(jìn)程在同一操作系統(tǒng)中同時運行,并實現(xiàn)彼此之間的協(xié)作。
進(jìn)程間通信方式:
-
管道(Pipe):
管道是最基本的進(jìn)程間通信方式
,它是一種半雙工的通信方式,通過管道,可以實現(xiàn)兩個不同進(jìn)程之間的通信,使用時,只能一方寫入,另一方讀出。 -
消息隊列(Message Queue):消息隊列可以在沒有任何關(guān)系的進(jìn)程之間傳遞數(shù)據(jù),它提供了一個消息的隊列,發(fā)送方將消息放入隊列,接收方從隊列中獲取消息。這種通信方式允許發(fā)送方和接收方獨立于對方,不需要同步操作。
-
共享內(nèi)存(Shared Memory):共享內(nèi)存是最快的進(jìn)程間通信方式,它將一個特定的內(nèi)存區(qū)域映射到多個進(jìn)程的地址空間中,使得這些進(jìn)程可以直接訪問這塊共享內(nèi)存。共享內(nèi)存通信方式適合于大量數(shù)據(jù)的高速交換。
-
信號量(Semaphore):信號量是一種計數(shù)器,用于進(jìn)程間的同步和互斥操作。它可以用來保護(hù)臨界區(qū)資源,控制并發(fā)訪問和協(xié)調(diào)進(jìn)程間的操作順序。
-
套接字(Socket):套接字是一種網(wǎng)絡(luò)編程中常用的通信方式,它可以在不同主機(jī)之間進(jìn)行進(jìn)程間通信。套接字通信方式適用于分布式系統(tǒng)或者網(wǎng)絡(luò)環(huán)境下的進(jìn)程間通信。
-
管理器對象(Manager Object):這種通信方式利用一個專門的進(jìn)程作為服務(wù)器,其他進(jìn)程通過請求服務(wù)器來實現(xiàn)通信。管理器對象可以提供共享數(shù)據(jù)、遠(yuǎn)程過程調(diào)用等功能。
-
文件和數(shù)據(jù)庫:進(jìn)程可以通過讀取和寫入文件、數(shù)據(jù)庫的方式進(jìn)行通信。這種通信方式適用于持久化數(shù)據(jù)的交換和共享。
匿名管道
匿名管道,顧名思義也就是沒有名字的管道,這種管道用于具有血緣關(guān)系的進(jìn)程(父子進(jìn)程等)之間進(jìn)行通信。它是一種單向通信方式(半雙工),即數(shù)據(jù)只能從一個進(jìn)程流向另一個進(jìn)程;
下面來了解匿名管道是如何創(chuàng)建的?
代碼驗證
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
void writer(int wfd)
{
const char* str="hello father,i am child";
char buffer[128];
int cnt=0;
pid_t pid=getpid();
while(1)
{
snprintf(buffer,sizeof(buffer),"message: %s, pid: %d,count:%d\n",str,pid,cnt);
write(wfd,buffer,sizeof(buffer)-1);
cnt++;
sleep(1);
}
}
void reader(int rfd)
{
char buffer[1024];
while(1)
{
ssize_t n=read(rfd,buffer,sizeof(buffer)-1);
printf("father get a message: %s",buffer);
}
}
int main()
{
int pipefd[2];
int n=pipe(pipefd);
if(n<0) return 1;
printf("pipefd[0]:%d,pipefd[1]:%d\n",pipefd[0],pipefd[1]);
pid_t id=fork();
if(id==0)
{
close(pipefd[0]);
writer(pipefd[1]);
exit(0);
}
close(pipefd[1]);
reader(pipefd[0]);
wait(NULL);
return 0;
}
對匿名管道的具體分析
匿名管道的特點
- 1.匿名管道只能用于具有情緣關(guān)系(父子進(jìn)程)的進(jìn)程間通信;
- 2.自帶同步機(jī)制
- 3.管道只能單向通信,屬于半雙工通信類型;
- 4.只要連接的進(jìn)程有一方退出,那么管道自動釋放,文件的生命周期是伴隨著進(jìn)程的;
PIPE_BUF
PIPE_BUF
是一個宏定義,在Linux系統(tǒng)中,它表示管道(pipe)的緩沖區(qū)大小(一般為4096字節(jié))。具體來說,PIPE_BUF
定義了一個原子寫入管道的最大字節(jié)數(shù)。
根據(jù)POSIX標(biāo)準(zhǔn)規(guī)定,當(dāng)要寫入的數(shù)據(jù)長度小于等于PIPE_BUF
時,操作系統(tǒng)會保證寫入的原子性。也就是說,對于不超過PIPE_BUF
字節(jié)的寫操作,寫入的數(shù)據(jù)會作為一個連續(xù)序列寫入管道,而不會被其他進(jìn)程的寫操作所中斷。
然而,當(dāng)要寫入的數(shù)據(jù)長度超過PIPE_BUF
時,操作系統(tǒng)并不保證寫入的原子性。這意味著,寫入的數(shù)據(jù)可能會被其他進(jìn)程的寫操作所中斷,從而導(dǎo)致數(shù)據(jù)交叉寫入到管道中。
需要注意的是,PIPE_BUF
的值可以在不同的系統(tǒng)上有所不同。在大多數(shù)系統(tǒng)中,PIPE_BUF
的值通常為4096字節(jié)(4KB),但也可以更大或更小。你可以通過在代碼中包含頭文件limits.h
并查看其中的定義來獲取當(dāng)前系統(tǒng)上的PIPE_BUF
值。文章來源:http://www.zghlxwxcb.cn/news/detail-850802.html
所以,在使用管道進(jìn)行進(jìn)程間通信的時候,如果希望保證數(shù)據(jù)的完整性,應(yīng)確保每次寫入的數(shù)據(jù)不超過PIPE_BUF
字節(jié)。如果要寫入的數(shù)據(jù)量超過了PIPE_BUF
,可以考慮分多次寫入或使用其他方式來保證數(shù)據(jù)的完整性。文章來源地址http://www.zghlxwxcb.cn/news/detail-850802.html
到了這里,關(guān)于Linux--進(jìn)程間的通信-匿名管道的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!