IPC的方式通常有管道(无名管道和命名管道),消息队列,信号量,共享存储,socket,streams等,其中socket和streams支持以不同主机上的两个进程IPC。(笔试题或面试可能会考,记住)
管道:(无名管道)
1.特点:
a 它是半双工的(数据只能在是单向的,只能一个写一个读,管道读走就没了),具有固定的读端和写端
b他是能用于具有亲属关系的进程之间的通信(父子进程或兄弟进程)
c 一种特殊的文件,只存于内存中,之建立在通信当中,父进程或子进程退出,管道消失,
管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。
原型:
1)父进程创建管道,得到两个⽂件描述符指向管道的两端
(2)父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。
(3)父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。
————————————————
本文为CSDN博主「木下 似水」的原创文章
返回值为-1,创建管道失败 为0 ,创建成功
int main(){
// int pipe(int pipefd[2]);
int fd[2]; // promole
pid_t pyd;
char buf[128];
pipe(fd);
if(pipe(fd)==-1){
printf("creat pipe error!\n");
}
pyd=fork(); //pid_t fork(void);
if(pyd<0){
printf("creat fork error!\n");
}
else if(pyd>0){
printf("the is father fork\n");
close(fd[0]);
write(fd[1],"pengyuandan hard success",strlen("pengyuandan hard success"));
wait();
}
else{
printf("the is chile fork\n");
close(fd[1]);
read(fd[0],buf,128);
printf("buf byte= %d ,buf data=%s\n",strlen(buf),buf);
exit(0);
}
// ssize_t read(int fd, void *buf, size_t count);
// ssize_t write(int fd, const void *buf, size_t count);
return 0;
}
运行结果为
the is father fork
the is chile fork
buf byte= 25 ,buf data=pengyuandan hard successv
也可以在父进程中加入sleep();等待子先写,当是子进程没有写入的内容,所以会出现堵塞
因为父子进程共用一个管道,所以父进程写入,子进程可以读出