系统调用pipe

    xiaoxiao2023-10-22  147

    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])与上述是同一个道理。

    最新回复(0)