通过父子进程完成对文件的拷贝(cp)

目录

题目

分析

思路

代码


题目

通过父子进程完成对文件的拷贝(cp)

分析

  1. 文件长度获取: lseek
  2. 子进程定位到文件一半: lseek
  3. 父进程怎么准确读到文件一半的位置?
  4. fork之前打开文件,父子进程读写时,位置指针是同一个

思路

  1. 首先进行参数检查,如果命令行参数数量不是 3 个(程序名、源文件名、目标文件名),则输出错误提示信息并返回 -1 结束程序。

  2. 打开源文件和目标文件:

    • 使用 open 函数以只读模式打开源文件(argv[1]),如果打开失败,输出错误信息并返回 -1 。
    • 使用 open 函数以只写、创建新文件(如果不存在)、截断文件的模式打开目标文件(argv[2]),并设置权限为 0777,如果打开失败,输出错误信息并返回 -1 。
  3. 计算源文件长度的一半:

    • 使用 lseek 函数将文件指针移动到源文件末尾(第三个参数为 2),获取源文件的长度,然后将长度除以 2 得到源文件长度的一半,存储在 len 变量中。
  4. 创建子进程:

    • 使用 fork 函数创建子进程,如果创建失败,输出错误信息并返回 -1 。
  5. 子进程执行的操作(拷贝后半段):

    • 使用 lseek 函数将源文件指针和目标文件指针都定位到源文件长度一半的位置。
    • 进入循环,使用 read 函数从源文件读取内容到 buf 中,每次最多读取 32 个字节,只要读取到的字节数 n 大于 0,就使用 write 函数将读取到的内容写入目标文件中,并且每次循环暂停 1 秒。
  6. 父进程执行的操作(拷贝前半段):

    • 使用 wait(NULL) 等待子进程执行完毕。
    • 将源文件指针和目标文件指针都定位到文件开头。
    • 进入循环,根据剩余要读取的字符个数 len 来确定每次读取的字节数。如果 len 大于 32,则读取 32 个字节;否则读取 len 个字节。使用 read 函数从源文件读取内容到 buf 中,然后使用 write 函数将读取到的内容写入目标文件中,同时更新剩余要读取的字符个数 len,每次循环暂停 1 秒。
  7. 最后,关闭源文件和目标文件。

 

总的来说,这段代码的目的是将一个源文件的内容分两部分,由父进程和子进程分别拷贝前半段和后半段到一个目标文件中

代码

#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[])
{
    int fd1, fd2;
    pid_t pid;
    char buf[32] = "";
    ssize_t n;
    if (argc != 3)
    {
        printf("err: %s <srcfile> <destfile>\n", argv[0]);
        return -1;
    }

    fd1 = open(argv[1], O_RDONLY);
    if (fd1 < 0)
    {
        perror("fd1 err");
        return -1;
    }
    fd2 = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0777);
    if (fd2 < 0)
    {
        perror("fd2 err");
        return -1;
    }

    //获取源文件长度的一半
    off_t len = lseek(fd1, 0, 2) / 2;

    //创建子进程
    pid = fork();
    if (pid < 0)
    {
        perror("fork err");
        return -1;
    }
    else if (pid == 0) //拷贝后半段
    {
        //定位到一半的位置
        lseek(fd1, len, 0);
        lseek(fd2, len, 0);

        //读源文件,写入目标文件
        while ((n = read(fd1, buf, 32)) > 0)
        {
            write(fd2, buf, n);
            sleep(1);
        }
    }
    else //拷贝前半段
    {
        wait(NULL); //等子进程读写完父进程再拷贝
        //定位到文件开头
        lseek(fd1, 0, 0);
        lseek(fd2, 0, 0);

        //读源文件,写入目标文件
        while (len > 0)
        {
            if (len > 32)
                n = read(fd1, buf, 32);
            else
                n = read(fd1, buf, len);
            write(fd2, buf, n);
            len -= n;   //len保存的是剩余要读的字符个数
            sleep(1);
        }
    }
    close(fd1);
    close(fd2);

    return 0;
}

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
子进程拷贝文件,你可以使用Python的`multiprocessing`模块来创建子进程,并使用操作系统提供的文件操作函数来完成文件拷贝。下面是一个示例代码,演示了如何在子进程拷贝文件: ```python import os import shutil from multiprocessing import Process def copy_file(source_file, target_file): try: with open(source_file, 'rb') as src, open(target_file, 'wb') as dst: # 以二进制模式打开源文件和目标文件 shutil.copyfileobj(src, dst) # 使用shutil模块的copyfileobj函数拷贝文件内容 print("文件拷贝成功") except IOError: print("文件拷贝失败") def copy_file_in_child_process(source_file, target_file): pid = os.fork() # 创建子进程 if pid == 0: # 子进程 copy_file(source_file, target_file) os._exit(0) # 子进程执行完毕后退出 else: # 进程 pid, status = os.waitpid(pid, 0) # 等待子进程结束 if os.WEXITSTATUS(status) == 0: print("子进程执行成功") else: print("子进程执行失败") # 使用示例 source_path = 'path/to/source/file.txt' target_path = 'path/to/target/file.txt' copy_file_in_child_process(source_path, target_path) ``` 在这个示例代码中,我们定义了`copy_file()`函数,该函数与之前的示例代码中的函数相同,用于拷贝文件。然后,我们定义了`copy_file_in_child_process()`函数,该函数创建一个子进程,并在子进程中调用`copy_file()`函数来拷贝文件进程使用`os.waitpid()`函数等待子进程结束,并根据子进程的执行状态进行处理。 请将示例代码中的`source_path`和`target_path`替换为实际的文件路径。这个示例代码会先创建一个子进程,然后在子进程中执行文件拷贝操作。进程会等待子进程结束后打印相应的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值