思维导图
父子进程关系图
父子进程内存问题
进程切换
练习
使用父子进程完成拷贝文件
#include <myhead.h>
int main(int argc, const char *argv[])
{
//对参数个数进行判断
if(argc != 3)
{
printf("file count error\n");
printf("urage:./a.out srcfile destfile\n");
return -1;
}
//定义文件描述符
int fd_src, fd_dest;
//以只读的形式打开文件
if((fd_src = open(argv[1], O_RDONLY)) == -1)
{
perror("open file");
return -1;
}
//以读写的形式打开文件
if((fd_dest = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0664)) == -1)
{
perror("open file");
return -1;
}
//获得源文件大小
off_t size = lseek(fd_src, 0, SEEK_END);
printf("size = %ld\n", size);
//子进程读取拷贝文件大小
off_t size_child = size/2;
printf("size_child = %ld\n", size_child);
//父进程读取拷贝文件大小
off_t size_father = size - size_child;
printf("size_father = %ld\n", size_father);
char buf[10];
//生成一个子进程
pid_t pid = fork();
if(pid < 0)
{
perror("fork error");
return -1;
}else if(pid == 0)//子进程拷贝前半段
{
lseek(fd_src, 0, SEEK_SET);//移动光标至开头
off_t ret,num=0;
while((ret = read(fd_src, buf, sizeof(buf))) > 0 && num < size_child)
{
if(num+ret > size_child)
ret = size_child-num;
write(fd_dest, buf, ret);
num += ret;
}
exit(EXIT_SUCCESS);
}else//父进程拷贝后半段
{
wait(NULL);//阻塞等待子进程结束并为其收尸
lseek(fd_src, size_child, SEEK_SET);//移动光标
lseek(fd_dest, size_child, SEEK_SET);
off_t ret;
while((ret = read(fd_src, buf, sizeof(buf))) > 0)
{
write(fd_dest, buf, ret);
}
}
close(fd_src);
close(fd_dest);
return 0;
}