新聞中心
linux進(jìn)程間通信是進(jìn)程間實(shí)現(xiàn)數(shù)據(jù)傳輸和數(shù)據(jù)共享的一種跨進(jìn)程間的接口,如果可以使用非標(biāo)準(zhǔn)方法實(shí)現(xiàn),就可以快速完成進(jìn)程間通信。Linux操作系統(tǒng)為進(jìn)程間提供了多種通信方式實(shí)現(xiàn)數(shù)據(jù)共享,主要包括管道通信(Pipes)、命名管道(Named Pipes)、信號(hào)(Signals)、消息隊(duì)列(Message Queues)、共享內(nèi)存(Shared Memory)和信號(hào)量(Semaphore)等。

成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù)團(tuán)隊(duì)是一支充滿著熱情的團(tuán)隊(duì),執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標(biāo)準(zhǔn)與要求,同時(shí)竭誠(chéng)為客戶提供服務(wù)是我們的理念。成都創(chuàng)新互聯(lián)公司把每個(gè)網(wǎng)站當(dāng)做一個(gè)產(chǎn)品來(lái)開(kāi)發(fā),精雕細(xì)琢,追求一名工匠心中的細(xì)致,我們更用心!
一、管道通信(Pipes)
管道通信是Linux中最基本的進(jìn)程間通信模型,它允許進(jìn)程之間兩個(gè)方向上數(shù)據(jù)傳輸,是半雙工的,而且只能在父子進(jìn)程間通信(即調(diào)用進(jìn)程和被調(diào)用進(jìn)程)。使用管道通信可以用下列代碼實(shí)現(xiàn):
int pipefd[2];
if(pipe(pipefd)
{
printf(“create pipe error!\n”);
return -1;
}
二、命名管道(Named Pipes)
命名管道使用文件系統(tǒng)來(lái)實(shí)現(xiàn),它可以實(shí)現(xiàn)不同進(jìn)程間的通信,改進(jìn)了管道的雙向的半雙工的通信模式,允許多個(gè)進(jìn)程讀寫(xiě)管道,可以實(shí)現(xiàn)全雙工的數(shù)據(jù)通信,但是它取決于系統(tǒng)調(diào)用現(xiàn)有的文件結(jié)構(gòu)來(lái)實(shí)現(xiàn),所以使用時(shí)也較為繁瑣,使用代碼如下:
int main()
{
int fd;
char * myfifo = “/tmp/myfifo”;
mkfifo(myfifo, 0666);
fd = open(myfifo, O_RDONLY);
read(fd, data_from_server, sizeof(data_from_server));
close(fd);
unlink(myfifo);
return 0;
}
三、信號(hào)(Signals)
信號(hào)是Linux操作系統(tǒng)中一種同步機(jī)制,可以在任何進(jìn)程間傳遞,用來(lái)喚醒目標(biāo)進(jìn)程,由于信號(hào)可能會(huì)被系統(tǒng)忽略或者阻止,所以信號(hào)只能用來(lái)傳遞一些小段的數(shù)據(jù),平時(shí)也比較少用到,使用代碼如下:
#include
void sig_handler(int signo)
{
if (signo == SIGINT)
{
printf(“recv SIGINT\n”);
}
}
int main(int argc, char *argv[])
{
//安裝信號(hào)處理函數(shù)
signal(SIGINT, sig_handler);
while(1)
{
sleep(1);
}
return 0;
}
四、消息隊(duì)列(Message Queues)
消息隊(duì)列是用來(lái)實(shí)現(xiàn)線程間或進(jìn)程間數(shù)據(jù)共享的重要手段,它主要用來(lái)在系統(tǒng)中傳遞小段的數(shù)據(jù),可以有效緩解進(jìn)程繁重的工作負(fù)荷,使用代碼如下:
#include
//消息緩沖區(qū)
struct msgbuf
{
long mtype;
char mtext[256];
};
int main()
{
int msgid;
int ret;
struct msgbuf buf;
msgid = msgget(0x1234, IPC_CREAT|0666);
if(msgid
{
printf(“msgget() error!\n”);
return -1;
}
while(1)
{
//接收消息隊(duì)列
ret = msgrcv(msgid, &buf, 256, 0, IPC_NOWAIT);
if(ret > 0)
{
printf(“receive:%s\n”, buf.mtext);
}
sleep(2);
}
return 0;
}
五、共享內(nèi)存(Shared Memory)
共享內(nèi)存是進(jìn)程間最高效方式之一,它可以用來(lái)實(shí)現(xiàn)進(jìn)程間大量數(shù)據(jù)的快速傳輸,因?yàn)樗褪且粋€(gè)物理內(nèi)存區(qū)域,多個(gè)進(jìn)程可以訪問(wèn)它,操作系統(tǒng)會(huì)維護(hù)它的一致性,使用代碼如下:
#include
int main()
{
int shmid;
void * shmaddr;
if((shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT))
{
perror(“shmget() error!\n”);
return -1;
}
if((shmaddr = shmat(shmid, 0, 0)) == (void *)-1)
{
perror(“shmat() error!\n”);
return -1;
}
//利用共享內(nèi)存完成數(shù)據(jù)傳遞
memcpy(shmaddr, data, 1024);
shmdt(shmaddr);
shmctl(shmid, IPC_RMID, 0);
return
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
新聞名稱:Linux進(jìn)程間通信方式:實(shí)現(xiàn)數(shù)據(jù)共享(linux進(jìn)程通信方式)
標(biāo)題路徑:http://www.5511xx.com/article/djciese.html


咨詢
建站咨詢
