進程和進程之間的內存是相對獨立的
進程和進程通訊原理
進程和進程之間通訊的方式
- 管道(使用最簡單)
- 只能用在有血緣關系的進程之中
- 信號(開銷最小)
- 共享映射區(無血緣關系)
- 本地套接字(最穩定,實現復雜度最高)
管道
管道必須用在有父子關系的進程中
管道是一種最基本的IPC機制,作用與有血緣關系的進程之間,調用pipe系統函數,即可以創建一個管道,
- 其本質是一個偽文件(實為內核緩存區)
- 由兩個文件描述符引用,一個表示讀端,一個表示寫端
- 規定數據從管道的寫入端流入管道,從讀取端讀出
局限性:
- 自己寫,不能自己讀
- 數據不可以反復讀
- 單工通信
- 血緣關系進程間可用
pipe函數,創建並打開管道
int pipe (int fd[2]);
// 參數
// fd[0] : 讀端
// fd[1] : 寫端
例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
void sys_err(const char *str)
{
perror(str);
exit(1);
}
int main(int agrc, char *argv[])
{
int ret;
int fd[2];
pid_t pid;
char buf[1024];
ret = pipe(fd);
if (ret == -1){
sys_err("pipe error");
}
pid = fork();
if (pid>0)
{
close(fd[0]); // 關閉讀端
write(fd[1], "hello pipe", strlen("hello pipe"));
close(fd[1]);
// 父進程
} else if(pid==0){
// 子進程
close(fd[1]);
ret = read(fd[0], buf, size(buf));
write(STDOUT_FILENO, buf, ret);
close(fd[0]);
}
return 0;
}
管道的讀寫行為
讀管道
- 管道有數據,read返回實際讀到的字節數
- 管道無數據,
- 無寫端,read返回0
- 有些端,read堵塞等待
寫管道
- 無讀端,異常終止
- 有讀端,
- 管道已滿,阻塞等待
- 管道未滿,返回寫出的字節個數