pipe属于进程间通信的一种方式,使用时注意以下几点:
1.常用与亲缘关系间进程通信(亲缘关系进程存在数据拷贝)
2.无名管道属于内核空间
3.无名管道创建成功会产生两个文件描述符:fd[0]用于读管道,fd[1]用于写管道
pipe原型:
int pipe (int pipefd[2]);//创建无名管道,成功返回0,失败返回-1
举例:父进程将一个文件内容通过匹配传给子进程
源代码:pipe.c
运行: ./a.out alarm.c log //将alarm.c 的内容传给log
运行效果:
#include<stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
int send_file(int *pipefd,const char *filename)
{
int fd;
char buff[1024];
int n;
if((fd = open(filename,O_RDONLY)) == -1)
{
fprintf(stderr,"FAIL TO OPEN THE %s , %s\n",filename,strerror(errno));
exit(EXIT_FAILURE);
}
while(1)
{
n = read(fd,buff,sizeof(buff));
if(n == 0)
break;
write(pipefd[1],buff,n);
}
return 0;
}
int receive_file( int *pipefd,const char *filename)
{
int fd;
char buff[1024];
int n;
if((fd = open(filename,O_WRONLY | O_CREAT | O_TRUNC , 0666)) == -1)
{
fprintf(stderr,"FAIL TO OPEN THE %s , %s\n",filename,strerror(errno));
exit(EXIT_FAILURE);
}
while(1)
{
n = read(pipefd[0],buff,sizeof(buff));
if(n == 0)
break;
write(fd,buff,n);
}
return 0;
}
int main(int argc, const char *argv[])
{
pid_t pid;
int fd;
int pipefd[2];
if (argc < 3)
{
fprintf(stderr, "Usage: %s <string>\n", argv[0]);
exit(EXIT_FAILURE);
}
if(pipe(pipefd) == -1)
{
perror("pipe");
exit(EXIT_FAILURE);
}
if((pid = fork()) == -1)
{
perror("FAIL TO CCREAT PROCESS:");
exit(EXIT_FAILURE);
}
if(pid == 0)
{
close(pipefd[1]);
receive_file(pipefd,argv[2]);
}
if(pid > 0)
{
close(pipefd[0]);
send_file(pipefd,argv[1]);
}
exit(EXIT_SUCCESS);
}