#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
//打开源文件
int fd_r = open("./tu.png", O_RDONLY);
if(fd_r < 0)
{
perror("open");
return -1;
}
//以写的方式创建拷贝文件
int fd_w = open("./copy.png", O_WRONLY|O_CREAT|O_TRUNC, 0664);
if(fd_w < 0)
{
perror("open");
return -1;
}
//文件大小
off_t size = lseek(fd_r, 0, SEEK_END);
//判断文件的奇偶行
int flag = size%2 == 0?0:1;
//创建一个子进程
pid_t pid = fork();
if (pid > 0)
{
sleep(1);
//修改文件偏移量
lseek(fd_r, 0, SEEK_SET);
lseek(fd_w, 0, SEEK_SET);
char buf[10] = {0};
ssize_t res = 0;
ssize_t half_size = size/2;
ssize_t read_size = 0;
while(1)
{
read_size = half_size/sizeof(buf) == 0? half_size:sizeof(buf);
if((res=read(fd_r, buf, read_size)) < 0)
{
perror("read");
return -1;
}
write(fd_w, buf, res);
if((half_size-=read_size) == 0)
{
break;
}
}
printf("前半部分拷贝完毕\n");
}
else if(0 == pid)
{
//子进程执行
//修改文件偏移量到size/2的位置
lseek(fd_r, size/2, SEEK_SET);
lseek(fd_w, size/2, SEEK_SET);
char c = 0;
for(int i=0; i<size/2+flag; i++)
{
if(read(fd_r, &c, 1) < 0)
{
perror("read");
return -1;
}
if(write(fd_w, &c , 1) < 0)
{
perror("write");
return -1;
}
}
printf("后半部分拷贝完毕\n");
}
else if(pid < 0)
{
perror("fork");
return -1;
}
//关闭
close(fd_r);
close(fd_w);
return 0;
}
作业:要求拷贝一张图片,子进程先拷贝后半部分,父进程再拷贝前半部分
最新推荐文章于 2024-06-16 23:26:06 发布