每個進程各自有不同的使用者地址空間,進程之間要交換資料必須通過在核心中開闢緩衝區,從而實現資料共用。
管道
管道是一種最基本的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機制
- 記憶體映射:幾個進程映射同一個記憶體區