1. 基于C语言实现,文件IO练习
2.代码实现
2.1(命令行指定)使用父子进程拷贝同一个文件,父进程拷贝前半部分,子进程拷贝后半部分
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <wait.h>
#include <stdlib.h>
int get_src_file_len(const char *srcfile,const char * destfile)
{
int sfd,dfd;
int len=0;
if((sfd = open(srcfile,O_RDONLY))==-1){
printf("open srcfile error");
}
if((dfd = open(destfile,O_RDWR|O_CREAT|O_TRUNC,0664))==-1){
printf("open destfile error");
}
len = lseek(sfd,0,SEEK_END);
close(sfd);
close(dfd);
return len;
}
int copy_file(const char *srcfile,const char * destfile,int start,int len)
{
int sfd,dfd;
char buf[10] = {0};
int ret=0;
int i = 0;
if((sfd = open(srcfile,O_RDONLY))==-1){
printf("open srcfile error");
}
if((dfd = open(destfile,O_RDWR))==-1){
printf("open destfile error");
}
lseek(sfd,start,SEEK_SET);
lseek(dfd,start,SEEK_SET);
while(1){
ret = read(sfd,buf,sizeof(buf));
i+=ret;
if(ret==0 || i>len) {
write(dfd,buf,ret-(i-len));
break;
}
write(dfd,buf,ret);
}
close(sfd);
close(dfd);
return 0;
}
int main(int argc,const char * argv[])
{
if(argc != 3){
fprintf(stderr,"input error,try again\n");
fprintf(stderr,"usage:./a.out srcfile,destfile\n");
return -1;
}
int len = get_src_file_len(argv[1],argv[2]);
printf("len = %d\n",len);
pid_t pid;
pid = fork();
if(pid < 0){
printf("fork error");
}else if(pid == 0){
printf("child start = %d,len=%d\n",0,len/2);
copy_file(argv[1],argv[2],0,len/2);
exit(EXIT_SUCCESS);
}else{
printf("parent start = %d,len=%d\n",len/2,len-len/2);
copy_file(argv[1],argv[2],len/2,(len-len/2));
wait(NULL);
}
return 0;
}
执行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/dca03ed4ad1845989f5d84e3948818e9.png)
2.2(非命令行指定)使用父子进程拷贝同一个文件,父进程拷贝前半部分,子进程拷贝后半部分
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <wait.h>
int copy_2(int fd, int df)
{
int ret, ret0, ret1;
char buy[1];
ret1 = lseek(fd, 0, SEEK_END) / 2;
int i = 0;
if ((ret0 = lseek(df, 0, SEEK_END)) <= 0)
{
lseek(fd, 0, SEEK_SET);
while ((ret = read(fd, buy, sizeof(buy))) > 0 && i < ret1)
{
write(df, buy, ret);
i += ret;
}
printf("前半部分\n");
}
else if ((ret0 = lseek(df, 0, SEEK_END)) > 0)
{
lseek(fd, ret0, SEEK_SET);
while ((ret = read(fd, buy, sizeof(buy))) > 0)
{
write(df, buy, ret);
}
printf("后半部分\n");
}
return 0;
}
int main(int argc, char const *argv[])
{
int fd, df;
if ((fd = open("./01.txt", O_RDONLY)) == -1)
printf("open src error\n");
if ((df = open("./03-03作业-存放拷贝.txt", O_RDWR | O_APPEND | O_CREAT, 0664)) == -1)
printf("open src error\n");
pid_t pid;
char s1[50] = {0};
pid = fork();
if (pid < 0)
{
printf("fork error\n");
}
else if (pid == 0)
{
printf("\n");
printf("这是子进程\n");
printf("\n");
copy_2(fd, df);
}
else
{
printf("这是父进程\n");
printf("\n");
copy_2(fd, df);
wait(NULL);
}
return 0;
}
执行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/2fff96d8bdd749cab6cdc33981dedfa3.png)
2.3 (命令行指定)使用三个进程拷贝同一个文件,每个进程拷贝文件的1/3
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <wait.h>
#include <stdlib.h>
int get_src_file_len(const char *srcfile,const char * destfile)
{
int sfd,dfd;
int len=0;
if((sfd = open(srcfile,O_RDONLY))==-1){
printf("open srcfile error");
}
if((dfd = open(destfile,O_RDWR|O_CREAT|O_TRUNC,0664))==-1){
printf("open destfile error");
}
len = lseek(sfd,0,SEEK_END);
close(sfd);
close(dfd);
return len;
}
int copy_file(const char *srcfile,const char * destfile,int start,int len)
{
int sfd,dfd;
char buf[10] = {0};
int ret=0;
int i = 0;
if((sfd = open(srcfile,O_RDONLY))==-1){
printf("open srcfile error");
}
if((dfd = open(destfile,O_RDWR))==-1){
printf("open destfile error");
}
lseek(sfd,start,SEEK_SET);
lseek(dfd,start,SEEK_SET);
while(1){
ret = read(sfd,buf,sizeof(buf));
i+=ret;
if(ret==0 || i>len) {
write(dfd,buf,ret-(i-len));
break;
}
write(dfd,buf,ret);
}
close(sfd);
close(dfd);
return 0;
}
int main(int argc,const char * argv[])
{
if(argc != 3){
fprintf(stderr,"input error,try again\n");
fprintf(stderr,"usage:./a.out srcfile,destfile\n");
return -1;
}
int len= get_src_file_len(argv[1],argv[2]);
printf("len = %d\n",len);
pid_t pid,pid1;
pid = fork();
if(pid < 0){
printf("fork error");
}else if(pid == 0){
printf("child1 start = %d,len=%d\n",0,len/3);
copy_file(argv[1],argv[2],0,len/3);
exit(EXIT_SUCCESS);
}else{
pid1=fork();
if(pid1<0){
printf("fork pid1 process error");
}else if(pid1 == 0){
printf("child2 start = %d,len=%d\n",len/3,(len/3)*2);
copy_file(argv[1],argv[2],len/3,(len/3)*2);
exit(EXIT_SUCCESS);
}
printf("parent start = %d,len=%d\n",(len/3)*2,len-(len/3)*2);
copy_file(argv[1],argv[2],(len/3)*2,len-(len/3)*2);
wait(NULL);
wait(NULL);
}
return 0;
}
执行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/b75ede5830c94eb8b7953f9be8c21d98.png)
2.4 (非命令行指定)使用三个进程拷贝同一个文件,每个进程拷贝文件的1/3
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <wait.h>
int copy_3(int fd, int df)
{
int ret, ret0, ret1;
char buy[1];
ret1 = lseek(fd, 0, SEEK_END) / 3;
int i = 0;
if ((ret0 = lseek(df, 0, SEEK_END)) <= 0)
{
lseek(fd, 0, SEEK_SET);
while ((ret = read(fd, buy, sizeof(buy))) > 0 && i < ret1)
{
write(df, buy, ret);
i += ret;
}
printf("前部分\n");
}
else if ((ret0 = lseek(df, 0, SEEK_END))==ret1)
{
lseek(fd, ret0, SEEK_SET);
while ((ret = read(fd, buy, sizeof(buy))) > 0 && i < ret1)
{
write(df, buy, ret);
i += ret;
}
printf("中部分\n");
}
else
{
ret0 = lseek(df, 0, SEEK_END);
lseek(fd, ret0, SEEK_SET);
while ((ret = read(fd, buy, sizeof(buy))) > 0)
{
write(df, buy, ret);
}
printf("后部分\n");
}
return 0;
}
int main(int argc, char const *argv[])
{
int fd, df;
if ((fd = open("./01.txt", O_RDONLY)) == -1)
printf("open src error\n");
if ((df = open("./04-04作业-存放3进程拷贝.txt", O_RDWR | O_APPEND | O_CREAT, 0664)) == -1)
printf("open src error\n");
pid_t pid;
char s1[50] = {0};
pid = fork();
if (pid < 0)
{
printf("fork error\n");
}
else if (pid == 0)
{
printf("\n");
printf("这是子1进程\n");
printf("\n");
copy_3(fd, df);
}
else
{
pid_t pid1;
pid1 = fork();
if (pid1 < 0)
{
printf("fork error\n");
}
else if (pid1 == 0)
{
printf("\n");
printf("这是子2进程\n");
printf("\n");
copy_3(fd, df);
}
else
{
printf("这是父进程\n");
printf("\n");
copy_3(fd, df);
wait(NULL);
wait(NULL);
}
}
return 0;
}
执行结果
![在这里插入图片描述](https://img-blog.csdnimg.cn/2170128dd856401a9288c971791126c2.png)
6. 非原创