Linux編程基礎——處理序間通訊

來源:互聯網
上載者:User

每個進程各自有不同的使用者地址空間,進程之間要交換資料必須通過在核心中開闢緩衝區,從而實現資料共用。

管道

管道是一種最基本的IPC機制,由pipe函數建立:

    int pipe(int filedes[2]);

調用pipe函數時在核心中開闢一塊緩衝區(稱為管道)用於通訊,它有一個讀端一個寫端,然後通過filedes參數傳出給使用者程式兩個檔案描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端(很好記,就像0是標準輸入1是標準輸出一樣)。所以管道在使用者程式看起來就像一個開啟的檔案,通過read(filedes[0]);或者write(filedes[1]);向這個檔案讀寫資料其實是在讀寫核心緩衝區。

一個基本樣本如下:

    #include <stdlib.h>
    #include
<unistd.h>
    #define MAXLINE 80

    int main(void)
    {
        int n;
        int fd[2];
        pid_t pid;
        char line[MAXLINE];

        if (pipe(fd) < 0) {
            perror("pipe");
            exit(1);
        }
        if ((pid = fork()) < 0) {
            perror("fork");
            exit(1);
        }
        if (pid > 0) { /* parent */
            close(fd[0]);
            write(fd[1], "hello world\n", 12);
            wait(NULL);
        } else { /* child */
            close(fd[1]);
            n = read(fd[0], line, MAXLINE);
            write(STDOUT_FILENO, line, n);
        }
        return 0;
    }

使用管道也有一些限制:

  • 管道的讀寫端通過開啟的檔案描述符來傳遞,因此要通訊的兩個進程必須從它們的公用祖先那裡繼承管道檔案描述符。
  • 兩個進程通過一個管道只能實現單向通訊

其它IPC機制

除了管道外,還有如下幾種常用的IPC機制:

  • 檔案:    幾個進程可以在檔案系統中讀寫某個共用檔案,也可以通過給檔案加鎖來實現進程間同步
  • 訊號:    進程間使用SIGUSR1和SIGUSR2實現使用者自訂功能
  • Socket:    它還可以跨主機,並且標準統一,不同的作業系統都支援,是使用的最廣泛的IPC機制
  • 記憶體映射:幾個進程映射同一個記憶體區
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.