无名管道:
相对于有名管道而言的, 无名管道在使用时产生, 不使用后释放。 并不会在系统上留下任何蛛丝马迹。
无名管道因其使用前没有任何的标示, 所以他只能应用于父子进程之间
。
子进程会复制父进程的文件表数组。(浅拷贝)
无名管道的操作: 创建 | int | pipe(int | fd[2]); | // fd[0] | 读 | fd[1] 写 |
打开 读 | read(fd[0], | buff, | size); | |||
写 | write(fd[1], | buff, | len); | |||
关闭 | close(fd[1]); | close(fd[0]); |
注意:: 管道都是半双工通讯, 而无名管道创建后, 父进程在 fork 产生子进程后,
两个进程分别有一对读写, 所以, 要在父子进程分别关闭读或写。
无名管道的创建是在fork创建前,通过pipe()创建管道,然后通过fork创建子进程,之后,子进程会拷贝父进程的代码段/数据段及堆栈段,因此,创建的管道会被复制一份,子进程一份,父进程一份,为了使管道正常通讯,必须处理已有管道。
pipe代码如下
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>
#include<string.h>
int main()
{
pid_t pid;
int fd[2];
char buff[128];
const char data[]="pipe test program";
int r;
int w;
memset((void*)buff,0,sizeof(buff));
if(pipe(fd)<0)
{
printf("error\n");
exit(1);
}
if((pid=fork())==0)
{
close(fd[1]);
sleep(5);
if((r==read(fd[0],buff,128))>0)
{
printf("child progress %d,%s\n",r,buff);
}
close(fd[0]);
exit(0);
}
else if(pid>0);
{
close(fd[0]);
sleep(5);
if(w=write(fd[1],data,strlen(data))!=-1)
{
printf("father progress %d,%s\n",w,data);
}
close(fd[1]);
waitpid(pid,NULL,0);
exit(0);
}
}