cs
复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, const char *argv[])
{
// 文件路径
const char *src_path = "/home/ubuntu/IO/xiaoxin.bmp";
const char *dest_path = "/home/ubuntu/IO/xiaoxin2.bmp";
// 打开源文件和目标文件
FILE *src = fopen(src_path, "rb");
if (src == NULL) {
perror("打开源文件失败");
return -1;
}
FILE *dest = fopen(dest_path, "wb");
if (dest == NULL) {
perror("打开目标文件失败");
fclose(src);
return -1;
}
// 获取文件总大小
fseek(src, 0, SEEK_END);
long file_size = ftell(src);
rewind(src); // 将指针重置到文件开头
// 计算父子进程各自拷贝的区域
long half_size = file_size / 2;
// 创建子进程
pid_t pid = fork();
if (pid < 0)
{
perror("fork失败");
fclose(src);
fclose(dest);
return -1;
}
if (pid == 0) {
// 子进程:拷贝文件的后半部分
FILE *src_child = fopen(src_path, "rb");
FILE *dest_child = fopen(dest_path, "rb+"); // 打开目标文件以读写模式
if (src_child == NULL || dest_child == NULL) {
perror("子进程文件打开失败");
exit(-1);
}
fseek(src_child, half_size, SEEK_SET); // 定位到文件的后半部分
fseek(dest_child, half_size, SEEK_SET); // 定位目标文件的后半部分
char buf[128] = {0};
size_t n;
while ((n = fread(buf, 1, sizeof(buf), src_child)) > 0) {
if (fwrite(buf, 1, n, dest_child) != n) {
perror("子进程写入失败");
fclose(src_child);
fclose(dest_child);
exit(-1);
}
}
printf("子进程完成文件后半部分的拷贝。\n");
fclose(src_child);
fclose(dest_child);
exit(0);
}
else
{
// 父进程:拷贝文件的前半部分
char buf[128] = {0};
size_t n;
while ((n = fread(buf, 1, sizeof(buf), src)) > 0)
{
if (fwrite(buf, 1, n, dest) != n)
{
perror("父进程写入失败");
fclose(src);
fclose(dest);
return -1;
}
if (ftell(src) >= half_size) {
break;
}
}
printf("父进程完成文件前半部分的拷贝。\n");
// 等待子进程完成
waitpid(pid, NULL, 0);
// 使用 diff 命令检查源文件和目标文件是否相同
char command[256];
snprintf(command, sizeof(command), "diff %s %s", src_path, dest_path);
system(command);
// 关闭文件
fclose(src);
fclose(dest);
}
return 0;
}