/*
#include <unistd.h>
int pipe(int pipefd[2]);
功能:创建匿名管道,用于进程间通信
参数:
- int pipefd[2] 这个数组是一个传出参数
- pipefd[0]对应管道的读端
- pipefd[1]对应管道的写端
返回值:
成功:返回0
失败:返回-1
管道默认是阻塞的:如果管道中没有数据,read阻塞,如果管道满了,write阻塞
注意:匿名管道只能用于有关系的进程
ulimit -a
- 可以查看管道缓冲大小
- 一块的大小为512字节
fpathconf(pipefd[0],_PC_PIPE_BUF);
- 查看管道大小
*/
//子进程发送数据给父进程
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
int main()
{
//管道的创建需要在fork之前,会得到两个文件描述符
int pipefd[2];//piped[0]读取端口,pided[1]写入端口
int ret=pipe(pipefd);
if(ret==-1)
{
perror("pipe");
exit(0);
}
//创建子进程
pid_t pid=fork();
if(pid>0)
{
//父进程
printf("i am parent,pid: %d\n",getpid());
//从管道的读取端读取数据
char buf[1024]={0};
while (1)
{
int len=read(pipefd[0],buf,sizeof(buf));//read会返回读取到的个数
printf("parent recv %s,pid: %d\n",buf,getpid());
//都不用暂停,因为读取时管道没有数据就会自动阻塞
char* str="hello,i am parent";
write(pipefd[1],str,strlen(str));//注意求字符串长度不用sizeof
sleep(1);
}
}
else
{
//子进程
printf("i am child,pid: %d\n",getpid());
//向管道中写入数据
while (1)
{
char* str="hello,i am child";
write(pipefd[1],str,strlen(str));//注意求字符串长度不用sizeof
sleep(1);
//读数据
char buf[1024]={0};
int len=read(pipefd[0],buf,sizeof(buf));//read会返回读取到的个数
printf("child recv %s,pid: %d\n",buf,getpid());
}
}
return 0;
}