IO进程——通过父子进程完成对文件的拷贝

这篇文章介绍了如何使用C语言中的fork和lseek函数,通过父子进程分工合作,实现文件从头到一半和从一半到尾的分段拷贝。作者详细展示了如何打开、定位和读写文件,确保了在并发环境下文件指针的正确管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.通过父子进程完成对文件的拷贝(cp),父进程从文件开始到文件的一半开始拷贝,子进程从文件的一半到文件末尾。要求:文件IO   cp  src  d

  1. 文件长度获取?lseek
  2. 子进程定位到文件一半的位置  lseek
  3. 父进程怎么能准确读到文件一半的位置
  4. fork之前打开文件,父子进程中读写文件时,位置指针是同一个
    ["code:c"]
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    
    int main(int argc, char const *argv[])
    {
        pid_t pid;
        int fd_src, fd_dest;
        char buf[32] = "";
        ssize_t s;
    
        if (argc != 3)
        {
            printf("format: %s <srcfile> <destfile>\n", argv[0]);
            return -1;
        }
    
        //打开文件
        fd_src = open(argv[1], O_RDONLY);
        if (fd_src < 0)
        {
            perror("src err");
            return -1;
        }
    
        fd_dest = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
        if (fd_dest < 0)
        {
            perror("dest err");
            return -1;
        }
    
        //计算文件一半长度
        off_t len = lseek(fd_src, 0, SEEK_END) / 2;
    
        pid = fork();
        if (pid < 0)
        {
            perror("fork err");
            return -1;
        }
        else if (pid == 0) //从一半到末尾读写
        {
            printf("child\n");
            //将子进程中文件定位到一半
            lseek(fd_src, len, SEEK_SET);
            lseek(fd_dest, len, SEEK_SET);
    
            //读写操作
            while (1)
            {
                if ((s = read(fd_src, buf, 32)) == 0)
                    break;
                write(fd_dest, buf, s);
               // sleep(1);
            }
        }
        else //从开头到一半
        {
            printf("parent\n");
            wait(NULL); //避免父子进程一起读写共用一个文件指针造成混乱
            //定位到文件开头
            lseek(fd_src, 0, SEEK_SET);
            lseek(fd_dest, 0, SEEK_SET);
    
            //读写操作,一共读len个
            while (len > 0)
            {
                if (len > 32)
                    s = read(fd_src, buf, 32);
                else
                    s = read(fd_src, buf, len);
                write(fd_dest, buf, s);
                len -= s; //len代表剩下要读的字符个数,每次减去读到的个数
               // sleep(1);
            }
        }
        close(fd_src);
        close(fd_dest);
    
        return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值