概要:

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

打开、创建和关闭文件

函数原型:

#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. 实验吧—隐写术——WP之 奇妙的音乐

    点击链接下载压缩包,解压后得到:一个图片,一个压缩包 打开图片: 看到海伦.凯勒我们都知道她是一位盲人,而下面黑色和灰色的点点应该就是盲文了,那么我们百度一下对照表 我们将图片里的盲文对照后得到; k ...

  2. 发布自己的npm包

    如何发布自己写的npm包,这里有详细解释 : https://blog.csdn.net/u010130282/article/details/82629924 本文旨在解释遇到的问题: 1:需要设置 ...

  3. (原创) 使用pymongo 3.6.0连接MongoDB的正确姿势

    0.疑惑 前两天使用pymongo连接MongoDB的时候发现了一个奇怪的现象:我本机MongoDB并没有打开,但是使用pymong.MongoClient()进行连接时,并没有异常,我的服务端也正常 ...

  4. Nio使用Selector客户端与服务器的通信

    使用NIO的一个最大优势就是客户端于服务器自己的不再是阻塞式的,也就意味着服务器无需通过为每个客户端的链接而开启一个线程.而是通过一个叫Selector的轮循器来不断的检测那个Channel有消息处理 ...

  5. Write your own Terraform provider: Part 1

    转自:https://container-solutions.com/write-terraform-provider-part-1/ This is the first part of a seri ...

  6. luarocks 自定义包发布试用

    luarocks 是一个方便的lua 包管理工具,可以帮助我们实现代码的复用以及分享 注册账户 我使用了gihtub 的账户,直接点击&&授权即可 创建一个简单的luarocks 包项 ...

  7. SCS Characteristics

    Each SCS is an autonomous web application. For the SCS's domain, all data, the logic to process that ...

  8. Qt开发问答

    Qt开发问答 1, Difference between Dialog and widget and QMainWindow http://www.qtcentre.org/threads/3465- ...

  9. ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二) UpdatePanel

    UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加 ...

  10. 2.初步认识Angular2

    简述:一个完整的Angular应用主要由六个重要部分构成,分别是:组件,模板,指令,服务,依赖注入,和路由.这些组成部分各司其职,而又紧密协作. 其中,与用户直接打交互的是模板视图,它是构成组件的要素 ...