2.1作业

1.拷贝图片

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include<stdio.h>
#include<string.h>
#define ERR_MSG(msg){printf("line:%d\n",__LINE__);perror(msg);}

int main(int argc, const char *argv[])
{
    char str[32]="";
    size_t res_r=0;
    size_t res_w=0;
    char c=0;
    //打开源文件并判断
    int ft_r=open("../Pictures/10.png",O_RDONLY);
    if(ft_r<0)
    {
        ERR_MSG("open");
        return -1;
    }
    //打开目标文件并判断
    int ft_w=open("../Pictures/7.png",O_WRONLY|O_CREAT,0777);
    if(ft_w<0)
    {
        ERR_MSG("open");
        return -1;
    }
    //获取文件大小
    off_t size_r=lseek(ft_r,0,SEEK_END);
    //创建子进程并判断
    pid_t  t=fork();
    if(t<0)
    {
        ERR_MSG("fork");
        return -1;
    }
    //子进程执行区域
     else if(0==t)
    {
        lseek(ft_r,size_r/2+1,SEEK_SET);  //防止文件大小为奇数,后半段为size_r+1;后半段为:size_t-1
        lseek(ft_w,size_r/2+1,SEEK_SET);
        while(1)
        {    
            res_r=read(ft_r, str, sizeof(str));        
            if(res_r<0)
            {
                ERR_MSG("read");
                return -1;
            }else if(0==res_r)
            {
                break;
            }
            res_w=write(ft_w, str,res_r);
            if(res_w<0)
            {
                ERR_MSG("write");
                return -1;
            }
            bzero(str,sizeof(str));
        }
        
    }
     //父进程执行区域
     else if(t>0)
    {
        sleep(2);   //休眠2s,等待子进程县拷贝后半段
        lseek(ft_r,0,SEEK_SET);
        lseek(ft_w,0,SEEK_SET);
        for(int i=0;i<(size_r/2)+1;i++)
        {
            res_r=read(ft_r, &c, sizeof(char));        
            if(res_r<0)
            {
                ERR_MSG("read");
                return -1;
            }
            res_w=write(ft_w,&c ,res_r);
            if(res_w<0)
            {
                ERR_MSG("write");
                return -1;
            }
        } 
    //关闭文件并判断
    if(close(ft_r)<0)
    {        
        ERR_MSG("close");
        return -1;
    }
    if(close(ft_w)<0)
    {
        ERR_MSG("close");
        return -1;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值