1.進程通信的目的
????(1) 數據傳輸: 一個進程需要將它的數據傳輸給另一個進程
????(2) 資源共享: 多個進程之間共享同樣的資源
????(3) 通知事件: 一個進程需要向另一個或一組進程發送消息, 通知它們發生了什么事情
2.管道
????管道是一種進程之間通信的一種方式, 我們把從一個進程連接到另一個進程的數據流叫做管道
3.匿名管道
????(1) 匿名管道的創建
int pipe(int fd[2]);
fd是一個文件描述符數組, fd[0] 代表讀端, fd[1] 代表寫端
返回值:成功過時返回0, 失敗時返回錯誤代碼
4.代碼演示
#include<stdio.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<error.h>
#include<stdlib.h>int main()
{int fd[2];int pip = pipe(fd);if(pip == -1){perror("pipe");exit(1);}pid_t id = fork();if(id == -1){perror("fork");exit(1);}if(id == 0){close(fd[0]);write(fd[1], "hello", 5);close(fd[1]);exit(0);}close(fd[1]);char buf[100];int len = read(fd[0], buf, strlen(buf));if(len == -1){perror("read");exit(1);}printf("%s\n", buf);return 0;
}
5.站在文件描述符角度理解
????
6.匿名管道的特點
????(1) 單向
????(2) 有血緣關系的進程才能通信
????(3) 同步互斥機制(管道沒有數據了就不讀了, 管道滿了就不能寫了)
????(4) 進程退出管道釋放,管道的生命周期隨進程
????(5) 管道提供面向字節流的服務
7.幾個名詞概念
????(1) 字節流: 由上層決定, 一次讀多少不確定
????(2) 數據不一致: 一個進程讀, 另一個進程寫
????(3) 臨界區: 兩個進程訪問臨界資源的那段代碼叫做臨界區
????(4) 互斥: 在任何一個時間點臨界區訪問臨界資源時只允許一個進程訪問
????(5) 訪問資源的原子性: 進程在操作某些資源時要么不做, 要么做完,中間不會被打擾
????(6) 同步: 以相對比較安全的順序訪問資源,這種安全性叫同步(為了防止饑餓現象)
????(7) 管道自帶互斥和同步, 當管道里無數據時, 父進程會等子進程退出
8.管道滿的時候
????(1) 所有管道寫端對應的文件描述符被關閉時, 則read返回0
????(2) 如果所有文件描述符讀端對應文件描述符被關閉時, 則write 操作會產生一個SIGPIPE, 進而可能導致write進程退出
????(3) 當要寫的數據不大于PIPE_BUF時(4096), Linux將保證寫入的原子性
????(4) 當寫的數據大于PIPE_BUF時, Linux將不再保證寫入的原子性