linux下c编程之无名管道pipe()函数

有名管道与无名管道是相对的,今天我们就来说说无名管道pipe吧!

无名管道与fork的使用:

linux下c编程之无名管道pipe()函数_第1张图片

下面我们还是通过一个小小的例子来说明一下无名管道吧!

#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;
}

linux下c编程之无名管道pipe()函数_第2张图片

1.fork一个父子进程

2.父进程进行写入,子进程输出

3.由于子进程是父进程的复制,所以在使用管道读写的时候要注意,

父进程要关闭管道的读close(fd[0]),

子进程要关闭管道的写close(fd[1]);

你可能感兴趣的:(编程,c,linux,null,input)