概要:

  • 打开、创建和关闭文件
  • 读写文件
  • 文件定位
  • 获取文件信息

打开、创建和关闭文件

函数原型:

#include <sys/types.h> //头文件

#include <sys/stat.h>

#include <fcntl.h>

int open(const char *pathname, int flags); //文件名 打开方式

int open(const char *pathname, int flags, mode_t mode);//文件名 打开方式 权限

flags和mode都是一组掩码的合成值,flags表示打开或创建的方式,mode表示文件的访问权限。

flags 的选项:

  • O_CREAT参数:
#include <func.h>
int main(int argc,char* argv[])
{
ARGS_CHECK(argc,2);
int fd;
fd=open(argv[1],O_RDONLY|O_CREAT);
ERROR_CHECK(fd,-1,"open");
printf("fd=%d\n",fd);
return 0;
}

open()函数出错时返回-1,创建成功时返回未使用的最小文件描述符

0 标准输入符

1 标准输出符

2 标准错误输出符

故该代码中open()返回值为3

  • O_CREAT加自定义权限:

当输入的文件名不存在时,自动创建文件,但该文件权限是有问题的,所以在open()函数后加上自定义权限参数

#include <func.h>

int main(int argc,char* argv[])
{
ARGS_CHECK(argc,2);
int fd;
fd=open(argv[1],O_RDONLY|O_CREAT,0600);
ERROR_CHECK(fd,-1,"open");
printf("fd=%d\n",fd);
return 0;
}

若文件已存在则跳出,否则创建文件:

#include <func.h>

int main(int argc,char* argv[])
{
ARGS_CHECK(argc,2);
int fd;
fd=open(argv[1],O_RDONLY|O_CREAT|O_EXCL,0600);
ERROR_CHECK(fd,-1,"open");
printf("fd=%d\n",fd);
return 0;
}

TRUNK参数:若文件已存在截断内容为0

#include <func.h>

int main(int argc,char* argv[])
{
ARGS_CHECK(argc,2);
int fd;
fd=open(argv[1],O_RDONLY|O_TRUNC,0600);
ERROR_CHECK(fd,-1,"open");
printf("fd=%d\n",fd);
return 0;
}

close用于文件的关闭:

int close(int fd);//fd表示文件描述词,是先前由open或creat创建文件时的返回值。

文件使用完毕后,应该调用close关闭它,一旦调用close,则该进程对文件所加的锁全都被释放,并且使文件的打开引用计数减1,只有文件的打开引用计数变为0以后,文件才会被真正的关闭。


读写文件

函数原型:

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);//文件描述词 缓冲区 长度

ssize_t write(int fd, const void *buf, size_t count);

对于read和write函数,出错返回-1,读取完了之后,返回0, 其他情况返回读写的个数

read.c

#include <func.h>
int main(int argc, char* argv[])
{
ARGS_CHECK(argc, 2);
int fd;
fd = open(argv[1], O_RDONLY);
ERROR_CHECK(fd, -1, "open");
printf("fd = %d\n", fd);
int ret;
ret = read(fd, buf, sizeof(buf));
ERROR_CHECK(ret, -1, "read");
printf("buf = %s\n", buf);
return 0;
}

write.c

#include <func.h>

int main(int argc,char* argv[])
{
ARGS_CHECK(argc,2);
int fd;
fd=open(argv[1],O_RDWR);
ERROR_CHECK(fd,-1,"open");
printf("fd = %d\n",fd);
int arr[5]={1,2,3,4,5};
int ret;
ret=write(fd,arr,sizeof(arr));
ERROR_CHECK(fd,-1,"write");
lseek(fd,0,SEEK_SET); //从文件头开始计算
memset(arr,0,sizeof(arr));
ret=read(fd,arr,sizeof(arr));
ERROR_CHECK(fd,-1,"read");
printf("ret = %d,arr[0] = %d,arr[3] = %d\n",ret,arr[0],arr[3]);
return 0;
}

文件定位

函数lseek将文件指针设定到相对于whence,偏移值为offset的位置

#include <sys/types.h>

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);//fd文件描述词

whence 可以是下面三个常量的一个

SEEK_SET 从文件头开始计算

SEEK_CUR 从当前指针开始计算

SEEK_END 从文件尾开始计算

  • 文件空洞——通常用于多进程间通信的时候的共享内存
#include <func.h>
int main(int argc,char* argv[])
{
ARGS_CHECK(argc,2);
int fd;
fd=open(argv[1],O_RDWR);
ERROR_CHECK(fd,-1,"open");
printf("fd=%d\n",fd);
int ret;
ret=lseek(fd,1024,SEEK_SET);
printf("lseek ret=%d\n",ret);
char c='H';
write(fd,&c,sizeof(c));
close(fd);
return 0;
}

  • 改变文件大小
#include <func.h>

int main(int argc,char* argv[])
{
ARGS_CHECK(argc,2);
int fd;
fd=open(argv[1],O_RDWR);
ERROR_CHECK(fd,-1,"open");
printf("fd=%d\n",fd);
int ret;
ret=ftruncate(fd,1024);
ERROR_CHECK(ret,-1,"ftruncate");
close(fd);
return 0;
}
获取文件信息

fstat和stat函数获取文件信息,调用完毕后,文件信息被填充到结构体struct stat变量中,函数原型为:

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

int stat(const char *file_name, struct stat *buf); //文件名 stat结构体指针

int fstat(int fd, struct stat *buf); //文件描述词 stat结构体指针

stat结构体:

struct stat {
dev_t st_dev; /* 如果是设备,返回设备表述符,否则为0 */
ino_t st_ino; /* i节点号 */
mode_t st_mode; /* 文件类型 无符号短整型 */
nlink_t st_nlink; /* 链接数 */
uid_t st_uid; /* 属主ID */
gid_t st_gid; /* 组ID */
dev_t st_rdev; /* 设备类型 */
off_t st_size; /* 文件大小,字节表示 */
blksize_t st_blksize; /* 块大小 */
blkcnt_t st_blocks; /* 块数 */
time_t st_atime; /* 最后访问时间 */
time_t st_mtime; /* 最后修改时间 */
time_t st_ctime; /* 最后权限修改时间 */
};

EXAMPLE:获得文件的大小

  • 用stat实现
    #include<sys/stat.h>
#include<unistd.h>
int main()
{
struct stat buf;
stat (“/etc/passwd”,&buf);
printf(“/etc/passwd file size = %d \n”,buf.st_size);//st_size可以得到文件大小
}
  • 用fstat实现
int fd = open (“/etc/passwd”,O_RDONLY); //先获得文件描述词 fstat(fd, &buf); 实例:
#include <func.h>
int main()
{
int fd = open("/home/a.txt", O_RDONLY);
if(fd == -1)
{
perror("open error");
exit(-1);
}
struct stat buf;
int iRet = fstat(fd, &buf);
if(iRet == -1)
{
perror("fstat error");
exit(-1);
}
printf("the size of file is : %d\n", buf.st_size);
return 0;
}

Linux下的文件操作——基于文件描述符的文件操作(1)的更多相关文章

  1. linux一切皆文件之tcp socket描述符(三)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 二.环境准备 ...

  2. Linux下如何查看tomcat是否安装、启动、文件路径、进程ID

    Linux下如何查看tomcat是否安装.启动.文件路径.进程ID 在Linux系统下,Tomcat使用命令的操作! 检测是否有安装了Tomcat: rpm -qa|grep tomcat 查看Tom ...

  3. linux下保存下位机输出的串口信息为文件

    linux下保存下位机输出的串口信息为文件 1.stty -F /dev/ttyUSB0 raw (转换成raw模式) 2.stty -F /dev/ttyUSB0 speed 115200 (设置波 ...

  4. Linux下使用matlab在后台默默的运行.m文件(无界面形式)

    Linux下使用matlab在后台默默的运行.m文件(无界面形式)本主在Ubuntu18.04LTS上已经安装了matlab直接运行Matlab$ matlab会启动 matlab,出现启动界面但想要 ...

  5. Linux--文件描述符、文件指针、索引节点

    Linux -- 文件描述符 文件描述符 Fd 当进程打开文件或创建新文件时,内核会返回一个文件描述符(非负整数),用来指向被打开的文件,所有执行I/O操作的系统调用(read.write)都会通过文 ...

  6. 文件描述符、文件表项、V节点表项的一些总结

    转自  http://blog.csdn.net/gzzheyi/article/details/7739556 表格可以参见APUE 第三版 P61. 文件描述符(进程级别): 1).在每个进程表中 ...

  7. Linux下的文件操作——基于文件描述符的文件操作(2)

    文件描述符的复制 MMAP文件映射 ftruncate修改文件大小 文件描述符的复制 ​ 系统调用函数dup和dup2可以实现文件描述符的复制,经常用来重定向进程的stdin(0), stdout(1 ...

  8. linux下如何挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享

    首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的.      命令格式:      mount [-t vfstype] [-o options ...

  9. linux下tar gz bz2 tgz z等众多压缩文件的压缩与解压方法

    Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...

随机推荐

  1. 20165313 《Java程序设计》第四周学习总结

    教材学习总结 public:1.用在类前.2.用在方法前 .3. 用在成员变量前 private:用在成员变量前 final1.用在类前2.用在方法前3.用在成员变量前 static:1.所有对象公有 ...

  2. root用户登录mysql后新建用户提示1045错误

    执行以下命令查看root权限 show grants for 'root'@'localhost'; 如果没有显示with grant option,说明是root没有拥有新建授权用户的权限(为什么会 ...

  3. Load Balancing OpenSSH SFTP with HAProxy

    In my previous post I described how we setup a Ubuntu Server (12.0.4) as an OpenSSH SFTP server. In ...

  4. 远程连接mysql数据库碰到的问题及解决方案

    直接用SecureCRT登录到我的linux服务器,连接mysql后出现以下错误 然后我用root用户登录到mysql查看了我的用户信息,如下 出现问题1的原因有很多种,我这里是因为用错了yangli ...

  5. 05机器学习实战之Logistic 回归

    Logistic 回归 概述 Logistic 回归 或者叫逻辑回归 虽然名字有回归,但是它是用来做分类的.其主要思想是: 根据现有数据对分类边界线(Decision Boundary)建立回归公式, ...

  6. Linux服务器定位CPU高占用率代码位置经历

    http://blog.csdn.net/zhu19774279/article/details/51303000

  7. [Hi3520DV200]烧录

    setenv ipaddr 192.168.1.11 setenv serverip 192.168.1.139 setenv gatewayip 192.168.1.1 mw.b ff ;sf pr ...

  8. 轻量级web框架cicada----(转)

    源码地址: https://github.com/TogetherOS/cicada 快速启动 下面来看看如何快速启动一个 HTTP 服务. 只需要创建一个 Maven 项目,并引入核心包. < ...

  9. Delphi Json之树遍历

    procedure TForm1.VisitDirJsonTree(const AJsonObj: ISuperObject); var i: Integer; oItem: TSuperAvlEnt ...

  10. mysql之 sysbench1.0.3 安装与系统压力测试

    针对系统和数据库压测是项目上线前必做的一项,这里使用的是最新版本的sysbench做的压测使用详解.sysbench可以做系统层面的压力测试(CPU.内存.硬盘IO.互斥锁.Thead),也可以做数据 ...