C语⾔进程和进程之间通讯的⽅式_管道的使⽤
进程和进程之间的内存是相对独⽴的
进程和进程通讯原理
进程和进程之间通讯的⽅式
管道(使⽤最简单)
只能⽤在有⾎缘关系的进程之中
信号(开销最⼩)
共享映射区(⽆⾎缘关系)
本地套接字(最稳定,实现复杂度最⾼)
管道
管道必须⽤在有⽗⼦关系的进程中
管道是⼀种最基本的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堵塞等待
写管道
⽆读端,异常终⽌
有读端,
管道已满,阻塞等待
管道未满,返回写出的字节个数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论