Linux网络程序设计之pipe和fork函数
2020-04-25 本文已影响0人
樱桃小琦子
写在前面
man操作对于编程学习非常有用,任何不清楚的函数都可以man一下

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

现在我们来学习pipe函数:

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

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

返回值:
若成功,返回0;若失败,返回-1。
现在我们来学习fork函数:

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

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

返回值:
若成功,子进程的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.关于父子进程关闭管道读写端的问题,在网上查询如下:
