有名管道与无名管道是相对的,今天我们就来说说无名管道pipe吧!
无名管道与fork的使用:
下面我们还是通过一个小小的例子来说明一下无名管道吧!
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/wait.h>
#include<stdlib.h>
int main()
{
pid_t pid;
char inf[30];
int fd[2],status;
float result=0;
char buf[30];
char delim[]=" ";
char *argv[3]={NULL};
pipe(fd);
pid=fork();
if(pid==-1)
{
printf("fail");
}
else if(pid==0)
{
int i=0;
int h,w;
close(fd[1]);
while(1)
{
read(fd[0],buf,10);
argv[0]=strtok(buf,delim);
if(strcmp(buf,"exit")==0)
{
exit(1);
}
while(argv[i]!=NULL)
{
argv[++i]=strtok(NULL,delim);
}
//slprintf();各种类型转换成字符串类型
//atoi atoul atof
h=atoi(argv[0]);
w=atoi(argv[1]);
result=w/(h*h/10000);
printf("result=%.2f\n",result);
if(result>25)
{
printf("胖啦!\n");
}
else if(result<25)
{
printf("瘦啦!\n");
}
else
{
printf("保持体形!\n");
}
}
}
else
{
close(fd[0]);
while(1)
{
printf("please input your height and weight\nif out,please 'exit'\n");
gets(inf);
write(fd[1],inf,strlen(inf)+1);
//signal(status,);
sleep(1);
if(waitpid(pid,NULL,WNOHANG)>0)
{
exit(1);
}
}
}
return 0;
}
1.fork一个父子进程
2.父进程进行写入,子进程输出
3.由于子进程是父进程的复制,所以在使用管道读写的时候要注意,
父进程要关闭管道的读close(fd[0]),
子进程要关闭管道的写close(fd[1]);