先创建管道,子进程复制父进程文件描述符信息,子进程拿到管道两端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);
}