掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
linux進程間通信是進程間實現(xiàn)數(shù)據(jù)傳輸和數(shù)據(jù)共享的一種跨進程間的接口,如果可以使用非標準方法實現(xiàn),就可以快速完成進程間通信。Linux操作系統(tǒng)為進程間提供了多種通信方式實現(xiàn)數(shù)據(jù)共享,主要包括管道通信(Pipes)、命名管道(Named Pipes)、信號(Signals)、消息隊列(Message Queues)、共享內(nèi)存(Shared Memory)和信號量(Semaphore)等。

成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù)團隊是一支充滿著熱情的團隊,執(zhí)著、敏銳、追求更好,是創(chuàng)新互聯(lián)的標準與要求,同時竭誠為客戶提供服務(wù)是我們的理念。成都創(chuàng)新互聯(lián)公司把每個網(wǎng)站當做一個產(chǎn)品來開發(fā),精雕細琢,追求一名工匠心中的細致,我們更用心!
一、管道通信(Pipes)
管道通信是Linux中最基本的進程間通信模型,它允許進程之間兩個方向上數(shù)據(jù)傳輸,是半雙工的,而且只能在父子進程間通信(即調(diào)用進程和被調(diào)用進程)。使用管道通信可以用下列代碼實現(xiàn):
int pipefd[2];
if(pipe(pipefd)
{
printf(“create pipe error!\n”);
return -1;
}
二、命名管道(Named Pipes)
命名管道使用文件系統(tǒng)來實現(xiàn),它可以實現(xiàn)不同進程間的通信,改進了管道的雙向的半雙工的通信模式,允許多個進程讀寫管道,可以實現(xiàn)全雙工的數(shù)據(jù)通信,但是它取決于系統(tǒng)調(diào)用現(xiàn)有的文件結(jié)構(gòu)來實現(xiàn),所以使用時也較為繁瑣,使用代碼如下:
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;
}
三、信號(Signals)
信號是Linux操作系統(tǒng)中一種同步機制,可以在任何進程間傳遞,用來喚醒目標進程,由于信號可能會被系統(tǒng)忽略或者阻止,所以信號只能用來傳遞一些小段的數(shù)據(jù),平時也比較少用到,使用代碼如下:
#include
void sig_handler(int signo)
{
if (signo == SIGINT)
{
printf(“recv SIGINT\n”);
}
}
int main(int argc, char *argv[])
{
//安裝信號處理函數(shù)
signal(SIGINT, sig_handler);
while(1)
{
sleep(1);
}
return 0;
}
四、消息隊列(Message Queues)
消息隊列是用來實現(xiàn)線程間或進程間數(shù)據(jù)共享的重要手段,它主要用來在系統(tǒng)中傳遞小段的數(shù)據(jù),可以有效緩解進程繁重的工作負荷,使用代碼如下:
#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)
{
//接收消息隊列
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)存是進程間最高效方式之一,它可以用來實現(xiàn)進程間大量數(shù)據(jù)的快速傳輸,因為它就是一個物理內(nèi)存區(qū)域,多個進程可以訪問它,操作系統(tǒng)會維護它的一致性,使用代碼如下:
#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元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流