美文网首页计算机专业学习
Linux网络程序设计之pipe和fork函数

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

作者: 樱桃小琦子 | 来源:发表于2020-04-25 17:32 被阅读0次

写在前面

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

使用man命令查看pipe函数详情: image.png

pipe函数详情截取:包括函数名称,用法,举例等。

image.png

现在我们来学习pipe函数:

image.png

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

image.png

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

image.png

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

现在我们来学习fork函数:

image

fork函数参数为void,即不需要参数。

image.png

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

image.png

返回值:
若成功,子进程的PID(进程号)被返回给父进程,0被返回给子进程;若失败,-1被返回给父进程,没有创建子进程。

现在来看这两个函数应用举例:

#include<sys/types.h>
#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);
    }
}   

总结

1.管道这个名字真的很形象。就想象一根管道,液体从中间流过,所以是单向的,一端输入(写),一端输出(读)。
2.关于父子进程关闭管道读写端的问题,在网上查询如下:

image.png

相关文章

网友评论

    本文标题:Linux网络程序设计之pipe和fork函数

    本文链接:https://www.haomeiwen.com/subject/kjvkwhtx.html