系统调用pipe

本文介绍了pipe函数的基本用法,包括函数原型、参数、返回值,说明了数据进出管道顺序为FIFO,以及读写注意事项和关闭管道的要求。还给出了通过fork和execl调用创建进程并使用pipe通信的示例。此外,讲解了dup和dup2函数,以及pipe作用于文件描述符0、1的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、pipe基本用法

     函数原型:

      int pipe(int file_descriptor[2])

 

     参数:

      file_descriptor[2]:两个元素的整数数组

     返回值:

     成功:  返回0,并通过值file_descriptor[2]传出两个文件描述符号;

               file_descriptor[0] :  通过此文件描述法从从管道读出数据

               file_descriptor[1] : 通过此文件描述符向管道写数据

            note :(1)写进程------file_descriptor[1]   ---->   pipe   -------file_descriptor[0]------>读进程;若反过来读写,则可能发生未知错误。

                                           数据进出管道顺序FIFO

                      (2)若关闭pipe的写入一端,则对于读取进程,read不会阻塞于等待数据,而是直接返回0

                        (3) fork调用中file_descriptor[2]有两份,欲关闭管道,必须将二者均关闭

   e.g.1   通过fork调用创建子进程,并通过pipe在父子进程之间通信

  

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 30

int main(){
  int pid;
  int fd[2];
  char buffer[NUM];
  
  if(pipe(fd)==0){  //pipe调用成功
     pid = fork();
     if(pid==-1){
       exit(0);
     }
     else if(pid==0){  //子进程
        memset(buffer,'\0',NUM);
        read(fd[0],buffer,NUM-1);
     }
     else{    //父进程
        memset(buffer,'\0',NUM);
        write(fd[1],buffer,strlen(buffer));
     }
  }
  return 0;
}

   e.g.2  通过execl调用创建新进程,并通过pipe在两个进程之间通信

2、pipe作用于文件描述符0,1

     首先会使用到这两个函数

     dup函数原型: int dup(int file_descriptor)

                   参数: file_descriptor,文件描述符

                   返回值: 返回与file_descriptor指向相同文件的最小可用文件描述符

     dup2函数原型:   int dup2(int file_descriptor_one,int file_descriptor_two)

                   类似于dup,但是其第二个参数指明想要创建file_descriptor_two来重复指向file_descriptor指向的文件,若file_descriptor_two被                     占用,则返回第一个大于file_descriptor_two且未被占用的值

   note:

   (1)、现在可以通过, close(0)  ;dup(file[0]),此时均可从0和file[0]读出管道中的数据,由于0又是标准输入,则可以直接使用从标准输入读               数据的函数,而此时,事实上,这些函数处理的是从管道输出的数据。

 (2)、close(1),dup(file[1])与上述是同一个道理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值