BUTTERSCOTCH

导航

Linux网络程序设计之pipe函数和fork函数

写在前面:

man操作对于编程的学习非常有用,任何不清楚的函数都可以man一下

使用man命令查看pipe函数:

pipe函数详情截取:包括函数名称,功能,应用举例等 

 现在我们来学习pipe函数:

 pipe函数有一个参数pipefd[2]

 pipe函数功能:

 用于创建一个管道。

 什么是管道呢?管道是一个单向的数据通道,用于进程间通信。数组pipefd用于返回2个文件描述符,这两个文件描述符代表的是管道的两端。pipefd[0]代表的是管道用于读的一端。pipefd[1]代表的是   管道用于写的一端。向管道写的一端写入的数据被缓存在kernel中,直到从读的一端被读出来。

 返回值:

 若成功,返回0;若失败,返回-1

 现在我们来学习fork函数:

 fork函数参数是void,即不需要参数

fork函数功能:
通过复制调用进程创建一个新的进程。
调用进程叫做父进程,新的进程叫做子进程。
父进程和子进程在分隔开的存储空间运行。

 
返回值:
若成功,子进程的PID(进程号)被返回给父进程,0被返回给子进程;若失败,-1被返回给父进程,没有创建子进程。
注意:成功后子进程和父进程收到的返回值不同 
现在来看这两个函数的应用:用管道实现父子进程通信
#include<sys/wait.h>
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>

int main(int argc,char *argv[])
{
    int pipefd[2];
    pid_t cpid;
    char buf;
    
    if(argc!=2){/*参数不对*/
        fprintf(stderr,"Usage:%s <string>\n",argv[0]);
        exit(EXIT_FAILURE);
    }
    
    if(pipe(pipefd)==-1){/*创建管道出错*/
        perror("pipe");
        exit(EXIT_FAILURE);
    }
    
    cpid=fork();/*创建一个新的进程*/
    if(cpid==-1){/*创建新的进程失败*/
        perror("fork");
        exit(EXIT_FAILURE);
    }
    
    if(cpid==0){/*子进程执行*/
        close(pipefd[1]);/*关闭写的一端*/
        
        while(read(pipefd[0],&buf,1)>0)
            write(STDOUT_FILENO,&buf,1);
        
        write(STDOUT_FILENO,"\n",1);
        close(pipefd[0]);
        exit(EXIT_SUCCESS);
        
    }else{/*父进程执行*/
        close(pipefd[0]);/*关闭读的一端*/
        write(pipefd[1],argv[1],strlen(argv[1]));
        close(pipefd[1]);
        wait(NULL);/*等待子进程结束*/
        exit(EXIT_SUCCESS);
View Code
总结:
1.管道这个名字真的很形象。就想象一根管道,液体从中间流过,所以是单向的,一端输入(写),一端输出(读)。
2.关于父子进程关闭管道读写端的问题,在网上查询如下:

posted on 2020-04-27 20:41  BUTTERSCOTCH  阅读(727)  评论(0编辑  收藏  举报