父子进程:
父子进程的变量之间存在着读时共享,写时复制原则
无名管道:
无名管道仅能用于有亲缘关系的进程之间通信如父子进程
代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <stdlib.h>
#define N 100
int main(int argc, const char *argv[]){
pid_t pid;
int fdr, fdw;
ssize_t nbyte;
int fd[2];
char buf[N] = "";
if(argc != 1 && argc != 3){
printf("number error\n");
exit(0);
}
if((fdr = open(argv[1], O_RDONLY)) < 0){
printf("read open error\n");
exit(0);
}
if((fdw = open(argv[2], O_CREAT|O_WRONLY|O_TRUNC, 0664)) < 0){
printf("write open error\n");
exit(0);
}
if(pipe(fd) < 0){
printf("pipe error\n");
exit(0);
}
pid = fork();//创建子进程
if(pid < 0){
printf("fork error\n");
exit(0);
}
else if(pid == 0){ // 子进程
while((nbyte = read(fd[0], buf, N)) > 0){ // 管道读取端读取消息
write(fdw, buf, nbyte); // 写入文件
}
}
else{
while((nbyte = read(fdr, buf, N)) > 0){ // 在被读写的文件中读取数据
write(fd[1], buf, nbyte); // 在管道写入端写入数据
}
}
return 0;
}
解释:
父进程打开并读取读文件中的数据,并将数据放入无名管道的写入端,子进程从无名管道的读取端读取数据并写入自己事先打开或创建的接受文件,直到管道内没有数据,最终文件实现复制效果。
注意:read函数返还值为真实读取的数据,N为读取的数据