Linux文件编程

文件描述符:

  • 文件的打开或创建,内核都会向进程返回一个非负整数(文件描述符)供用户对其进行操作read,write
  • 系统默认0,1,2分别为标准输入,标准输出,标准错误
  • 程序运行通过文件描述符来区分不同的文件
  • 文件描述符仅作用在当前进程
  • open或create,成功返回文件描述符,失败返回-1

静态文件和动态文件:

静态文件:文件存在块设备中的文件系统文件的,就是静态文件
动态文件:当我们去open一个文件时,Linux内核在进程建立一个打开文件的数据结构,记录该文件的信息,这就是动态文件

  • 打开文件后,对文件的读写的对象是该动态文件
  • 我们对文件的读写后,动态文件和块设备的静态文件不同步了,通过close内部内核将内存中的动态文件更新到静态文件
  • 块设备不灵活,是按块读写,而动态文件则是按字节读写,所以我们一般对动态文件操作

文件操作的api:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//成功返回文件描述符,失败返回-1
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
int creat(const char *pathname,mode_t mode);
void close(int fd);

Pathname:要打开的文件名(包含路径,缺省为当前路径)

Flags:
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR:可读可写打开
以上权限应当只指定一个,下列权限为可选择的
O_CREAT:若文件不存在则创建它,使用此项时,需同时说明第三个参数mode,说明新文件的存取许可权限
O_EXCL:如果同时指定O_CREAT,而文件存在,则出错
O_APPEND:每次write都加到文件末端
O_TRUNC:write时,清空原有的文件内容,再写新内容

Mode:一定是在使用O_CREAT标志,mode记录待创建文件的访问权限

#include <unistd.h>
//返回写入/读出的字节大小
ssize_t write(int fd,const void *buf,size_t count);
ssize_t write(int fd,const void *buf,size_t count);
off_t lseek(int fd,off_t offset,int whence);//返回指定位置和当前位置距离单位

Whence:指定光标位置
SEEK_SET
文件头部
SEEK_CUR
当前位置
SEEK_END
文件尾部

Offset:光标相对whence偏移单位,负数向前偏移,正数向后偏移

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int fd;
	char r_Buf[128] = {'\0'};
	char w_Buf = "hello,world!";

	fd = open("file1",O_RDWR|O_CREAT,0600);
	if(fd == -1){
		printf("open file1 failed\n");
		exit(-1);
	}
	
	int n_write = write(fd,w_Buf,strlen(w_Buf));
	lseek(fd,0,SEEK_SET);
	int n_read = read(fd,r_Buf,n_write);
	printf("content = %s\n",r_Buf);

	close(fd);
	return 0;
}

cp实现源码

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
	if(argc != 3){
		printf("parram error!!\n");
		exit(-1);
	}

	int fdSrc;
	int fdDes;
	int size;
	char *readBuf = NULL;

	fdSrc = open(argv[1],O_RDWR);
	size = lseek(fdSrc,0,SEEK_END);
	lseek(fdSrc,0,SEEK_SET);

	readBuf = (char *)malloc(size+1);
	int n_read = read(fdSrc,readBuf,size);

	fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
	int n_write = write(fdDes,readBUf,size);

	close(fdSrc);
	close(fdDes);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值