Linux下的文件操作——基于文件描述符的文件操作(1)
概要:
- 打开、创建和关闭文件
- 读写文件
- 文件定位
- 获取文件信息
打开、创建和关闭文件
函数原型:
#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)的更多相关文章
- linux一切皆文件之tcp socket描述符(三)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 二.环境准备 ...
- Linux下如何查看tomcat是否安装、启动、文件路径、进程ID
Linux下如何查看tomcat是否安装.启动.文件路径.进程ID 在Linux系统下,Tomcat使用命令的操作! 检测是否有安装了Tomcat: rpm -qa|grep tomcat 查看Tom ...
- linux下保存下位机输出的串口信息为文件
linux下保存下位机输出的串口信息为文件 1.stty -F /dev/ttyUSB0 raw (转换成raw模式) 2.stty -F /dev/ttyUSB0 speed 115200 (设置波 ...
- Linux下使用matlab在后台默默的运行.m文件(无界面形式)
Linux下使用matlab在后台默默的运行.m文件(无界面形式)本主在Ubuntu18.04LTS上已经安装了matlab直接运行Matlab$ matlab会启动 matlab,出现启动界面但想要 ...
- Linux--文件描述符、文件指针、索引节点
Linux -- 文件描述符 文件描述符 Fd 当进程打开文件或创建新文件时,内核会返回一个文件描述符(非负整数),用来指向被打开的文件,所有执行I/O操作的系统调用(read.write)都会通过文 ...
- 文件描述符、文件表项、V节点表项的一些总结
转自 http://blog.csdn.net/gzzheyi/article/details/7739556 表格可以参见APUE 第三版 P61. 文件描述符(进程级别): 1).在每个进程表中 ...
- Linux下的文件操作——基于文件描述符的文件操作(2)
文件描述符的复制 MMAP文件映射 ftruncate修改文件大小 文件描述符的复制 系统调用函数dup和dup2可以实现文件描述符的复制,经常用来重定向进程的stdin(0), stdout(1 ...
- linux下如何挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享
首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式: mount [-t vfstype] [-o options ...
- linux下tar gz bz2 tgz z等众多压缩文件的压缩与解压方法
Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲ta ...
随机推荐
- 【牛客练习赛22 C】
https://www.nowcoder.com/acm/contest/132/C 题目大意:在n个区间中取出n个数,相加的和一共会出现多少种结果. 题目分析:对于这种挑选数字相加,由于每一步不同的 ...
- 《DSP using MATLAB》Problem 5.2
代码: %% ---------------------------------------------------------------------------------- %% Output ...
- hdu4847 Wow! Such Doge! KMP
Chen, Adrian (November 7, 2013). “Doge Is An Ac- tually Good Internet Meme. Wow.”. Gawker. Retrieved ...
- powerdesigner基本使用
parent sonPK主键 FK外键 n ------> 1 alter table muniubox.cpa_accounting_book add constraint FK_Refere ...
- 针对 Intellij IDEA 2018.2 版本 异常退出问题
原文:https://blog.csdn.net/weixin_41370091/article/details/81322694 近日刚安装好Intellij IDEA(2018.2 Ultimat ...
- POI事件模型处理execl导入功能(只支持07版本的execl)
由于通过new XSSFWorkbook 这种方式导入导致生产环境端口宕机.通过dump文件和javacore文件分析是导入功能导致的.解决办法:自己通过网上写的工具类,不知道是否存在bug. pac ...
- JAVA (1)–第一个GUI程序 添加标题 关闭窗口 屏幕位置 导入图标
import java.awt.*; // 可以改成 import javax.swing.*; public class FirstFrame { public static void main ...
- day 53 js学习之
---恢复内容开始--- 1.昨日作业讲解 弄一个上图一样的选择器,可以全选,可以反选,取消 <!DOCTYPE html> <html lang="zh-CN" ...
- fastjson总结
1,文件的转成字节数组byte[]的时候,可以直接用fastjson序列化和反序列化 2,用@RequestBody接受json的时候,content-type是否已经application/json ...
- MongoDB 设置账号和密码
一.安装MongoDB 1.环境配置: i.操作系统:CentOS release 6.8 (Final) [root@iZ2ze2pbbffhmn53ao4tuaZ bin]# cat /etc/r ...