Linux進程間通信方式

一、管道通信

管道是最常用的進程間通信方式之一。管道通信採用先進先出原則,即寫入的數據先被讀出,沒有被讀取的數據會被存儲在內核緩衝區中。管道通信一般用於有親緣關係(父子進程或兄弟進程)的進程間通信。

下面是一個簡單的管道通信示例:

int main(){
    int fd[2];
    pid_t pid;
    char readbuffer[80];
    pipe(fd);
    pid = fork();
    if(pid == 0){
        //子進程
        close(fd[0]);
        char *msg = "hello, parent process\n";
        write(fd[1],msg,strlen(msg)+1);
        close(fd[1]);
    }
    else{
        //父進程
        close(fd[1]);
        read(fd[0],readbuffer,sizeof(readbuffer));
        printf("message from child process: %s",readbuffer);
        close(fd[0]);
    }
    return 0;
}

二、消息隊列通信

消息隊列是一個消息鏈表,因此可以向任意進程發送消息。每個消息都有一個類型標識符和一個數據部分,可以通過操作系統提供的函數來發送和接收消息。

下面是一個簡單的消息隊列通信示例:

int main(){
    int msgid;
    key_t key;
    struct msgbuf{
        long mtype;
        char mtext[256];
    }msg;
    key = ftok("msgq_file",'b');
    msgid = msgget(key,IPC_CREAT | 0666);
    msg.mtype = 1;
    strcpy(msg.mtext,"message from process 1\n");
    msgsnd(msgid,&msg,sizeof(msg.mtext),0);
    msgctl(msgid,IPC_RMID,NULL);
    return 0;
}

三、共享內存通信

共享內存是最快的進程間通信方式之一,因為它不涉及到複製數據,而是把數據放置在一個共享的內存區域里。多個進程都可以訪問這個區域,用於在進程間共享數據。

下面是一個簡單的共享內存通信示例:

int main(){
    int shmid;
    char *shmaddr;
    key_t key;
    key = ftok("/dev/null", 1);
    shmid = shmget(key, 4096, IPC_CREAT | 0666);
    shmaddr = (char*)shmat(shmid,NULL,0);
    strcpy(shmaddr, "shared memory message");
    printf("message:%s", shmaddr);
    shmdt(shmaddr);
    shmctl(shmid,IPC_RMID,NULL);
    return 0;
}

四、信號通信

信號可以被用來通知其他進程某個事件的發生。進程可以定義一個信號處理函數來對信號進行處理。

下面是一個簡單的信號通信示例:

#include 
#include 
#include 
void signal_handler(int signo){
    if(signo == SIGUSR1){
        printf("received SIGUSR1 signal\n");
    }
}
int main(){
    int pid;
    pid = fork();
    if(pid == 0){
        //子進程
        kill(getppid(),SIGUSR1);
        exit(0);
    }
    else{
        //父進程
        signal(SIGUSR1,signal_handler);
        pause();
    }
    return 0;
}

五、套接字通信

套接字通信是一種在網絡上進行進程間通信的方式。套接字可以用於同一台計算機上的進程間通信,也可以用於不同計算機之間的進程間通信。

下面是一個簡單的套接字通信示例:

#include 
#include 
#include 
#include 
#include 
int main(){
    int sockfd;
    char buffer[1024];
    struct sockaddr_in server_addr;
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    server_addr.sin_addr.s_addr = INADDR_ANY;
    bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));
    listen(sockfd,10);
    while(1){
        int connfd = accept(sockfd,(struct sockaddr*)NULL,NULL);
        char *msg = "message from server\n";
        write(connfd,msg,strlen(msg));
        close(connfd);
    }
    return 0;
}

原創文章,作者:SWRXS,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/333411.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SWRXS的頭像SWRXS
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相關推薦

  • 如何通過jstack工具列出假死的java進程

    假死的java進程是指在運行過程中出現了某些問題導致進程停止響應,此時無法通過正常的方式關閉或者重啟該進程。在這種情況下,我們可以藉助jstack工具來獲取該進程的進程號和線程號,…

    編程 2025-04-29
  • Python緩存圖片的處理方式

    本文將從多個方面詳細闡述Python緩存圖片的處理方式,包括緩存原理、緩存框架、緩存策略、緩存更新和緩存清除等方面。 一、緩存原理 緩存是一種提高應用程序性能的技術,在網絡應用中流…

    編程 2025-04-29
  • Python在線編輯器的優勢與實現方式

    Python在線編輯器是Python語言愛好者的重要工具之一,它可以讓用戶方便快捷的在線編碼、調試和分享代碼,無需在本地安裝Python環境。本文將從多個方面對Python在線編輯…

    編程 2025-04-28
  • Java表單提交方式

    Java表單提交有兩種方式,分別是get和post。下面我們將從以下幾個方面詳細闡述這兩種方式。 一、get方式 1、什麼是get方式 在get方式下,表單的數據會以查詢字符串的形…

    編程 2025-04-27
  • 跨域通信浮標——實現客戶端之間的跨域通信

    本文將介紹跨域通信浮標的使用方法,該浮標可以實現客戶端之間的跨域通信,解決了瀏覽器同源策略的限制,讓開發者能夠更加方便地進行跨域通信。 一、浮標的原理 跨域通信浮標的原理是基於浮動…

    編程 2025-04-27
  • 用Pythonic的方式編寫高效代碼

    Pythonic是一種編程哲學,它強調Python編程風格的簡單、清晰、優雅和明確。Python應該描述為一種語言而不是一種編程語言。Pythonic的編程方式不僅可以使我們在編碼…

    編程 2025-04-27
  • Java多版本支持實現方式

    本文將從以下幾個方面闡述如何實現Java多版本支持,並給出可行的代碼示例。 一、多版本Java環境概述 Java是一門跨平台的編程語言,但是在不同的應用場景下,可能需要使用不同版本…

    編程 2025-04-27
  • SpringBoot Get方式請求傳參用法介紹

    本文將從以下多個方面對SpringBoot Get方式請求傳參做詳細的闡述,包括URL傳參、路徑傳參、請求頭傳參、請求體傳參等,幫助讀者更加深入地了解Get請求方式下傳參的相關知識…

    編程 2025-04-27
  • Java中的殭屍進程簡介與解決方法

    本文將對Java中的殭屍進程進行詳細闡述,並給出幾種解決方法。 一、殭屍進程的概念 在操作系統中,進程是指正在執行的程序。當一個進程創建了一個子進程,而該子進程完成了任務卻沒有被父…

    編程 2025-04-27
  • 通信專業Python和Java的開發技巧

    本文旨在介紹通信專業Python和Java的開發技巧,為讀者提供實用且可操作的思路和方法。 一、Python在通信領域中的應用 Python是一種優秀的程序設計語言,因其易學易用、…

    編程 2025-04-27

發表回復

登錄後才能評論