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被返回给父进程,没有创建子进程。
注意:成功后子进程和父进程收到的返回值不同
现在来看这两个函数的应用:用管道实现父子进程通信
View Code
总结:
#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.关于父子进程关闭管道读写端的问题,在网上查询如下:
posted on 2020-04-27 20:41 BUTTERSCOTCH 阅读(732) 评论(0) 编辑 收藏 举报