1、
#include <myhead.h>
int main(int argc, const char *argv[])
{
//判断传入文件个数
if(argc != 3)
{
printf("intput file error\n");
printf("usage:./a.out srcfile dstfile\n");
return -1;
}
//定义两个文件
FILE *srcfp, *dstfp;
//以只读的形式打开第一个文件
if((srcfp=fopen(argv[1],"r")) == NULL)
{
perror("fopen srcfile error");
return -1;
}
//以只写的形式打开第二个文件
if((srcfp=fopen(argv[2], "w")) == NULL)
{
perror("fopen dstfile error");
return -1;
}
pid_t pid = fork(); //创建子进程
//搬运数据
char buf[128] = "";
//文件总长度
int len = fseek(srcfp, 0, SEEK_END);
int l = len/2;
if(pid > 0)
{
//父进程执行
//光标位置不偏移
fseek(srcfp, 0, SEEK_SET);
//定义缓存区用来搬运数据
int ret1 = 0;
while((ret1=fread(buf, sizeof(buf), l, srcfp)) > 0)
{
//将数据写入第二个文件中
fwrite(buf, ret1, l, dstfp);
}
printf("父进程拷贝成功\n");
sleep(5);
//阻塞等待回收子进程资源
wait(NULL);
}else if(pid == 0)
{
//子进程执行
//光标偏移文件字节数一半
fseek(srcfp, l, SEEK_SET);
int ret2 = 0;
while((ret2=fread(buf, sizeof(buf), len-l, srcfp)) > 0)
{
//将数据写入第二个文件中
fwrite(buf, ret2, len-l, dstfp);
}
printf("子进程拷贝成功\n");
}else
{
perror("fork error");
return -1;
}
//关闭文件
fclose(srcfp);
fclose(dstfp);
return 0;
}
结果为:
ubuntu@ubuntu:zy$ gcc 01kao.c
ubuntu@ubuntu:zy$ ./a.out ./test1.c ./test11.txt
父进程拷贝成功
子进程拷贝成功
2、
#include <myhead.h>
int main(int argc, const char *argv[])
{
//判断传入文件个数
if(argc != 3)
{
printf("intput file error\n");
printf("usage:./a.out srcfile dstfile\n");
return -1;
}
//定义两个文件
FILE *srcfp, *dstfp;
//以只读的形式打开第一个文件
if((srcfp=fopen(argv[1],"r")) == NULL)
{
perror("fopen srcfile error");
return -1;
}
//以只写的形式打开第二个文件
if((srcfp=fopen(argv[2], "w")) == NULL)
{
perror("fopen dstfile error");
return -1;
}
pid_t pid = fork(); //创建子进程
//文件总长度
int len = fseek(srcfp, 0, SEEK_END);
int l1 = len/3;
int l2 = (len-l1)/2;
int l3 = len-l1-l2;
if(pid > 0)
{
//父进程执行
//创建子进程2
pid_t pid1 = fork();
if(pid1 > 0)
{
//父进程拷贝
//光标位置不偏移
fseek(srcfp, 0, SEEK_SET);
//搬运数据
int buf[128];
//定义缓存区用来搬运数据
int ret1 = 0;
while((ret1=fread(buf, sizeof(buf), l1, srcfp)) > 0)
{
//将数据写入第二个文件中
fwrite(buf, ret1, l1, dstfp);
}
printf("父进程拷贝成功\n");
sleep(5);
//阻塞等待回收子进程资源
wait(NULL);
}else if(pid1 == 0)
{
//子进程2执行
//光标位置偏移2/3
fseek(srcfp, l1+l2, SEEK_SET);
//搬运数据
int buf[128];
//定义缓存区用来搬运数据
int ret = 0;
while((ret=fread(buf, sizeof(buf), l3, srcfp)) > 0)
{
//将数据写入第二个文件中
fwrite(buf, ret, l3, dstfp);
}
printf("子进程2拷贝成功\n");
}
}else if(pid == 0)
{
//子进程执行
//光标偏移文件字节数1/3
fseek(srcfp, l1, SEEK_SET);
//搬运数据
int buf[128];
int ret = 0;
while((ret=fread(buf, sizeof(buf), l2, srcfp)) > 0)
{
//将数据写入第二个文件中
fwrite(buf, ret, l2, dstfp);
}
printf("子进程1拷贝成功\n");
}else
{
perror("fork error");
return -1;
}
//关闭文件
fclose(srcfp);
fclose(dstfp);
return 0;
}
结果为:
ubuntu@ubuntu:zy$ gcc 02kao.c
ubuntu@ubuntu:zy$ ./a.out ./test2.c ./test.txt
父进程拷贝成功
子进程2拷贝成功
子进程1拷贝成功
3、思维导图