先创建管道,子进程复制父进程文件描述符信息,子进程拿到管道两端fd.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#define BUFSIZE 1024
int main()
{
	int pd[2];
	pid_t pid;
	char buf[BUFSIZE];
	int len;
	if(pipe(pd)<0)
	{
		perror("pipe()");
		exit(1);
	}
	
 
	pid=fork();
	if(pid<0){
		perror("fork()");
		exit(1);
	}
	
	if(pid==0)
	{
		//child read
		//不用写端,关闭
		close(pd[1]);
		len=read(pd[0],buf,BUFSIZE);
		
		//写到终端上
		write(1,buf,len);
		close(pd[0]);
		exit(0);
	}
	else
	{
		//parent write
		
		close(pd[0]);
		write(pd[1],"HEllo!",6);
		close(pd[1]);
		wait(NULL);
		exit(0);
	}
 
	exit(0);
}

流媒体广播项目 子进程解码,使用解码器流媒体播放 exec mpg123 父子之间管道通信

伪码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
#define BUFSIZE 1024
int main()
{
	int pd[2];
	pid_t pid;
	char buf[BUFSIZE];
	int len;
	if(pipe(pd)<0)
	{
		perror("pipe()");
		exit(1);
	}
 
 
	pid=fork();
	if(pid<0){
		perror("fork()");
		exit(1);
	}
 
	if(pid==0)
	{
		//child read
		
		close(pd[1]);//关闭写端
		dup2(pd[0],0); //输出到标准输出
		close(pd[0]);
		fd=open("/dev/null",O_RDWR);
		dup2(fd,1);
		dup2(fd,2);
		
		execl("which mpg123","mpg123","-",NULL);
		perror("execl");
		exit(1);
	}
	else
	{
		//parent write
 
		close(pd[0]); //关闭读端
		//父进程从网上收数据,往管道中写
		close(pd[1]);
		wait(NULL);
		exit(0);
	}
 
	exit(0);
}