当前位置: 首页 > backend >正文

9月2日

1> 使用多进程完成两个文件的拷贝:父进程拷贝前一半内容,子进程拷贝后一半内容

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>

#define BUF_SIZE 4096

int main(int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr, "Usage: %s <src_file> <dest_file>\n", argv[0]);
exit(1);
}

    int src_fd = open(argv[1], O_RDONLY);
if (src_fd < 0) {
perror("open src");
exit(1);
}

    int dest_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (dest_fd < 0) {
perror("open dest");
close(src_fd);
exit(1);
}

    // 用 lseek 获取文件大小
off_t filesize = lseek(src_fd, 0, SEEK_END);
if (filesize == -1) {
perror("lseek");
close(src_fd);
close(dest_fd);
exit(1);
}
off_t halfsize = filesize / 2;

    // 把源文件读指针重置到开头
lseek(src_fd, 0, SEEK_SET);

    pid_t pid = fork();
if (pid < 0) {
perror("fork");
exit(1);
}
else if (pid > 0) {
// 父进程:拷贝前一半
char buf[BUF_SIZE];
off_t to_copy = halfsize;
ssize_t n;

        while (to_copy > 0 && (n = read(src_fd, buf, (to_copy > BUF_SIZE ? BUF_SIZE : to_copy))) > 0) {
write(dest_fd, buf, n);
to_copy -= n;
}

        wait(NULL);  // 等待子进程完成
}
else {
// 子进程:拷贝后一半
char buf[BUF_SIZE];
ssize_t n;

        // 将文件指针移动到后一半
lseek(src_fd, halfsize, SEEK_SET);
lseek(dest_fd, halfsize, SEEK_SET);

        while ((n = read(src_fd, buf, BUF_SIZE)) > 0) {
write(dest_fd, buf, n);
}
exit(0);
}

    close(src_fd);
close(dest_fd);

    printf("File copy finished.\n");
return 0;
}

2> 父进程创建两个子进程,子进程1负责拷贝文件前一半内容,子进程2负责拷贝文件后一半内容,父进程阻塞回收两个子进程资源

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>

#define BUF_SIZE 4096

int main(int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr, "Usage: %s <src_file> <dest_file>\n", argv[0]);
exit(1);
}

    int src_fd = open(argv[1], O_RDONLY);
if (src_fd < 0) {
perror("open src");
exit(1);
}

    int dest_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (dest_fd < 0) {
perror("open dest");
close(src_fd);
exit(1);
}

    // 用 lseek 获取文件大小
off_t filesize = lseek(src_fd, 0, SEEK_END);
if (filesize == -1) {
perror("lseek");
close(src_fd);
close(dest_fd);
exit(1);
}
off_t halfsize = filesize / 2;

    // 回到文件开头
lseek(src_fd, 0, SEEK_SET);

    pid_t pid1 = fork();
if (pid1 == 0) {
// 子进程1:拷贝前半部分
char buf[BUF_SIZE];
off_t to_copy = halfsize;
ssize_t n;
int sfd = open(argv[1], O_RDONLY);
int dfd = open(argv[2], O_WRONLY);

        while (to_copy > 0 && (n = read(sfd, buf, (to_copy > BUF_SIZE ? BUF_SIZE : to_copy))) > 0) {
write(dfd, buf, n);
to_copy -= n;
}
close(sfd);
close(dfd);
exit(0);
}

    pid_t pid2 = fork();
if (pid2 == 0) {
// 子进程2:拷贝后半部分
char buf[BUF_SIZE];
ssize_t n;

        // 子进程自己打开文件
int sfd = open(argv[1], O_RDONLY);
int dfd = open(argv[2], O_WRONLY);

        // 定位到后一半
lseek(sfd, halfsize, SEEK_SET);
lseek(dfd, halfsize, SEEK_SET);

        while ((n = read(sfd, buf, BUF_SIZE)) > 0) {
write(dfd, buf, n);
}
close(sfd);
close(dfd);
exit(0);
}

    // 父进程:等待两个子进程完成
wait(NULL);
wait(NULL);

    close(src_fd);
close(dest_fd);

    printf("File copy finished.\n");
return 0;
}

http://www.xdnf.cn/news/19642.html

相关文章:

  • 深入分析 json2(新)与标准的 jsonrpc的区别
  • zephyr设备树的硬件描述转换为c语言
  • Hash 算法 SHA-1、SHA-256、SHA-384、SHA-512 对比
  • SpringBoot3 + Netty + Vue3 实现消息推送(最新)
  • 食品分类案例
  • 码住!辉芒微MCU型号规则详细解析
  • Kafka 架构详解
  • 动子注册操作【2025.9.2学习记录】
  • MVP架构深层剖析-从六大设计原则的实现角度到用依赖注入深度解耦
  • Elasticsearch 核心知识与常见问题解析
  • MCU上跑AI—实时目标检测算法探索
  • 【 HarmonyOS 6 】HarmonyOS智能体开发实战:Function组件和智能体创建
  • 空间不足将docker挂载到其他位置
  • 03_网关ip和端口映射(路由器转发)操作和原理
  • 梯度消失问题:深度学习中的「记忆衰退」困境与解决方案
  • React 学习笔记4 Diffing/脚手架
  • 2025了,你知道electron-vite吗?
  • 网络原理——HTTP/HTTPS
  • ImageMagick命令行图片工具:批量实现格式转换与压缩,支持水印添加及GIF动态图合成
  • 2条命令,5秒安装,1秒启动!Vite项目保姆级上手指南
  • 鸿蒙NEXT界面交互全解析:弹出框、菜单、气泡提示与模态页面的实战指南
  • 开源的聚合支付系统源码/易支付系统 /三方支付系统
  • Erlang 利用 recon 排查热点进程
  • 人工智能之数学基础:分布函数对随机变量的概率分布情况进行刻画
  • 微信小程序 navigateTo 栈超过多层后会失效
  • 在 Delphi 5 中获取 Word 文档页数的方法
  • 小程序蓝牙低功耗(BLE)外围设备开发指南
  • 365 天技术创作手记:从一行代码到四万同行者的相遇
  • C++多线程编程:std::thread, std::async, std::future
  • Jenkins Pipeline 语法