网站首页 > 技术文章 正文
l 每个进程都有各自的用户地址空间,各个进程间的全局变量相互之间都看不到,因此不同进程间通信必须经过内核,在内核开辟一块缓存区,一个进程将数据从用户空间拷贝到内核缓存区,另一个进程从内核缓存区把数据取走,这种通信机制为进程间通信。
l 管道是进程间通信的一种方法,主要用于父子进程。即通过fork()创建的父子间的通信。
l 管道的创建
#include<unistd.h>
Int pipe(int fd[2])
返回值:成功返回0,出错返回-1
Fd参数返回两个文件的描述符,fd[0]指向管道的读端,fd[1]指向管道的写道,fd[1]的输出是fd[0]的输入。
l 管道实现进程间通信
1. 父进程创建管道,得到两个文件描述符指向管道的两端;
2. 父进程fork出子进程,子进程也有两个文件描述符指向同管道;
3. 父进程关闭fd[0],子进程关闭fd[1],即子进程关闭管道的读端,父进程关闭管道的写端,(管道只支持单向通信)。子进程向管道写数据,父进程从管道读数据。管道是环形队列实现的。
l 管道特点
1. 管道只支持父子进程通信,
2. 管道只支持单向通信;
3. 管道面向字节流;
4. 管道随进程,进程在管道在,进程消失管道对应的端口关闭,两个进程都消失管道也消失。
l 管道通信代码
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
int main()
{
int fd[2];
int pipe_id=pipe(fd);
if(pipe_id==-1)
{
perror("pipe error\n");
return -1;
}
pid_t id=fork();
if(id==0)
{
int i=0;
close(fd[0]);
char* child_fork="I am child fork!";
while(i<5)
{
write(fd[1],child_fork,strlen(child_fork)+1);
sleep(2);
i++;
}
}
else if(id>0)
{
close(fd[1]);
char msg[100];
int j=0;
while(j<5)
{
memset(msg,'\0',sizeof(msg));
ssize_t s=read(fd[0],msg,sizeof(msg));
if(s>0)
{
msg[s-1]='\0';
}
printf("%s\n",msg);
j++;
}
}
else
{
perror("fork error\n");
return -1;
}
return 0;
}
l
猜你喜欢
- 2024-10-01 原来“进程间通信”是这么回事! 什么叫进程间通信
- 2024-10-01 如何轻松掌握linux内核进程间通信方法
- 2024-10-01 Linux进程间通信(四) - 共享内存 linux共享内存休眠
- 2024-10-01 Linux进程间通信之匿名管道 linux配置匿名ftp服务器
- 2024-10-01 Linux讲解 进程间通信 命名管道 徐教头讲解象棋合集
- 2024-10-01 linux下进程通信的几种方式 linux系统下进程间通信
- 2024-10-01 Linux进程间通信——内存共享映射
- 2024-10-01 c/c++ Linux 进程间通信------共享内存
- 2024-10-01 Linux系统编程之进程间通信方式:消息队列
- 2024-10-01 如何使两个无关的进程进行通信? 两个进程间的通信
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)