文件描述符
对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。
Linux系统有默认的标识符:0 1 2
标准输入 标准输出 标准错误
文件描述符的作用域仅在当前进程
在Linux中操作一个文件,一般是先open一个文件,得到文件描述符后对文件进行读写等操作,最后close文件
文件分为静态文件和动态文件
静态文件:在磁盘里存在的文件未被打开
动态文件:open静态文件以后,会产生一个结构体,里面存放fd文件描述符,信息节点,buf(内存)存文件内容,调用close将动态文件存到磁盘,成为静态文件。
编程实现CP指令
C语言参数 argc argv
#include<stdio.h>
int main(int argc,char **argv)
{
//这里的argc是为了统计 cp src.c des.c指令 字符串数目
//argv[0] argv[1] argv[2] 代表每个字符串数组元素
return 0;
}
实现指令思路
1.打开源文件
2.把文件内容读到buf里
3.打开/创建目标文件
4.将buf里的内容写到目标文件
5.close源文件 目标文件
实现代码
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
int fdSrc;
int fdDes;
char *readBuf=NULL;
if(argc != 3){
printf("shu ru you wu!\n"); //这个判断防止 少输一个文件名 或者多输一个文件名
exit(-1);
}
fdSrc=open(argv[1],O_RDWR);
//argv[1]代表cp指令的源文件
int size=lseek(fdSrc,0,SEEK_END); //因为读写的时候我们都要输入文件的size 做个动态的size 防止给固定size 出bug 例如 给个1024的大小 那么里拷贝的时候只能拷贝小于等于1024的文件 不然就出错
//这里lseek函数的返回值正好就是文件的大小
lseek(fdSrc,0,SEEK_SET); //因为统计文件大小时光标被推到了末尾,读的时候会从光标位置开始读,所以将光标重置为开头位置
readBuf=(char *)malloc(sizeof(char)*size+8); //这里要将定义的readbuf开空间 +8是为了防止溢出
int n_read=read(fdSrc,readBuf,size);
fdDes=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
//这里 如果你打开的目标文件已存在 并且里面有内容 新写入的内容只会覆盖 所以需要O_TRUNC来清零文件
int n_write=write(fdDes,readBuf,size);
close(fdSrc);
close(fdDes);
return 0;
}
修改配置文件
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
int main(int argc,char **argv)
{
int fdSrc;
char *readBuf=NULL;
if(argc != 2){
printf("shu ru you wu!\n");
exit(-1);
}
fdSrc=open(argv[1],O_RDWR);
int size=lseek(fdSrc,0,SEEK_END);
lseek(fdSrc,0,SEEK_SET);
readBuf=(char *)malloc(sizeof(char)*size+8);
int n_read=read(fdSrc,readBuf,size);
char *p=strstr(readBuf,"LENG=");
//使用strstr函数在readbuf里查找修改字符返回值为一个字符指针
if(p==NULL){//判断是否找到
printf("not find\n");
exit(-1);
}
p=p+strlen("LENG=");//将指针的位置往后移到修改的内容位置
*p='5'; //修改的内容是字符 如果写整数5就会出错
lseek(fdSrc,0,SEEK_SET); //重置光标位置到开头
int n_write=write(fdSrc,readBuf,size);
//将修改好的buf内容写入文件
close(fdSrc);
return 0;
}
写结构体到文件
#include<stdio.h>
#include<sys/types.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
struct Test
{
int a;
char c;
};
int main()
{
int fd;
struct Test data[2]={{100,'h'},{200,'a'}};
//定义一个结构体数组
fd = open("./file1",O_RDWR);
int n_write=write(fd,&data,sizeof(struct Test)*2);
//buf是一个常量指针 是个地址就行 这样就可以往文件里写整数、结构体
lseek(fd,0,SEEK_SET);
int n_read=read(fd,&data,sizeof(struct Test)*2);
printf("read:%d,%c \n",data[0].a,data[0].c);
printf("read:%d,%c \n",data[1].a,data[1].c);
close(fd);
return 0;
}