将一个文件打开并且重新复制一份:

注意:打开方式和是否对文件偏移量进行追加的问题。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main(int argc, char* argv[])//主函数参数有3个,它自己,源文件,目标文件。
{
if ( argc != 3 )//如果没有3个参数,说明缺少文件名
{
printf(“缺少文件名\n”);
exit(0);
}
char * src_name = argv[1];//记录原文件地址
char * dst_name = argv[2];//记录目标文件地址
int fdr = open(src_name,O_RDONLY);//原文件以只读方式打开,保护原文件,不被更改
int fdw = open(dst_name,O_WRONLY|O_CREAT,0600);//目标文件以只写方式打开,若文件不存在那就创建文件
if ( fdr == -1 || fdw == -1 )//如果打开有问题的话,open函数返回值为-1,所以输出打开失败,结束进程。
{
printf("open file failed\n");
exit(0);
}
//定义一个数组,来保存从原文件中读取到的数据。
char buff[256] = {0};
int n = 0;
//从源文件中读到多少数据就向目标文件中传入多少数据
//循环读取,传入,直到读取结束
while( (n = read(fdr,buff,256)) > 0 )
{
write(fdw,buff,n);
}
//关闭源文件和目标文件,结束进程
close(fdr);
close(fdw);
exit(0);
}
父进程打开的文件,fork后,子进程也可以访问,并且和父进程共享文件偏移量。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
int fd = open(“a.txt”,O_RDONLY);
assert( fd != -1 );
pid_t pid = fork();
assert( pid != -1 );
if ( pid == 0 )
{
char buff[128] = {0};
read(fd,buff,1);
printf("child read:%s\n",buff);
sleep(1);
read(fd,buff,1);
printf("child read:%s\n",buff);
}
else
{
char buff[128] = {0};
read(fd,buff,1);
printf("parent read:%s\n",buff);
sleep(1);
read(fd,buff,1);
printf("parent read:%s\n",buff);
}
close(fd);
exit(0);
}
如果只在父进程中打开一个文件,那么父子进程共享一个文件描述符,只使用同一个文件偏移量。那么父子进程不会对文件中的每个元素进行重复提取。
假设有另外一种情况呢!(父子进程分别打开文件)

那就会这样;父子进程各使用各自的文件偏移量,共用一个inode节点。父子进程各自对文件整体输出一次。
man 1命令 2.系统调用 3.库函数
库函数 实现在库里 libxx.a libxx.so 用户态
系统调用:内核中,编写内核,就实现。 内核态

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>
#include <fcntl.h>
int main()
{
printf(“A”);
write(1,“B”,1);
fork();
exit(0);
}
//打印出BAA
因为子进程将父进程缓冲区中的A复制了一份,在进程结束时,强制刷新缓冲区。write和printf实现方式的不同
本文介绍在Linux环境下如何打开并复制文件,重点关注打开方式和文件偏移量的处理。通过示例代码展示了如何使用read和write系统调用进行文件读写。同时,讨论了在fork后,父进程和子进程如何共享文件描述符和文件偏移量,以及不同情况下可能的行为。最后,简要提到了Linux中的系统调用和库函数的区别。
4085

被折叠的 条评论
为什么被折叠?



