Linux 文件API
9/19/2017 开始攻读《LinuxC编程实战》,这是相关的笔记
1.创建
int creat(const char *filename, mode_t mode);
参数mode指定新建文件的存取权限,它与umask一起决定文件最终的存取权限(mode&umask),其中umask代表的是创建文件时需要去掉的文件存取权限,可通过系统调用下列函数改变umask的值:
int umask(int newmask);
改调用通过将umask设置为newmask,然后返回旧的umask的值,它只影响r、w、x的权限。
2.打开
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
open有两种形式,其中pathname是我们要打开的文件名,包括路径,否则缺省在当前目录下。flags为下面任意一个值或者是多个值的组合:

其中O_RDONLY、O_WRONLY、O_RDWR只能选一个用。
如果选用O_CREAT,则应选用open的第二种形式,即带参数mode,表示文件的访问权限,mode的值从下图中选:


除上述利用宏来产生标志之外,我们还可以利用数字表示法:
用五位数字表示文件的权限:
- 第一位,设置用户ID
- 第二位,设置组ID
- 第三位,设置用户权限
- 第四位,设置组权限
- 第五位,设置其他人的权限
每位的取值可为1(执行权限)、2(写权限)、4(读权限)、0(无权限),或是它们的和。
设置ID与不设置ID用1、0表示。
举例:要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户 ID 位
——对应的数值为10705
open("test" , O_CREAT , );
//或 open("text" , O_CREAT , S_IRWXU | S_IROTH | S_IXOTH | S_ISUID);
如果操作成功,则返回一个文件描述符,以后对文件的操作都通过该文件描述符表示
以O_CREAT为标识符的open实际上实现了creat(); ,下列代码等同于creat();
open( pathname, O_CREAT | O_RDWR, mode);
3.读写
int read(int fd , const void *buf , size_t length);
int write(int fd , const void *buf , size_t length);
参数buf是缓冲区指针,length是缓冲区大小(单位是字节)。read函数实现从文件描述符fd读取length个字节输入到缓冲区中。write函数实现的是向文件描述符fd里写入length个字节的缓冲区数据。
read():返回值是实际读取字节的个数。同理,write():是实际写入字节的个数。
4.定位
int lseek(int fd , offset_t offset , int whence);
lseek();将文件的读写指针相对whence位置移动offset个字节,操作成功时,返回文件指针相对于文件头的位置。
参数 whence 可使用下述值:
- SEEK_SET:相对文件开头
- SEEK_CUR:相对文件读写指针的当前位置
- SEEK_END:相对文件末尾
offset 可取负值,例如下述调用可将文件指针相对当前位置向前移动 5 个字节:
lseek(fd , -5 ,SEEK_CUR);
由于 lseek 函数的返回值为文件指针相对于文件头的位置,因此下列调用的返回值就是文件的长度:
lseek( fd , 0 , SEEK_END);
5.关闭
int close(int fd);
关闭文件,即关闭文件描述符。
例程:
编写一个程序,在当前目录下创建用户可读写文件“hello.txt”,在其中写入“Hello, software weekly”,关闭该文件。再次打开该文件,读取其中的内容并输出在屏幕上。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h> int main()
{
int fd, len;
char str[LENGTH];
/* 创建并打开文件 */
fd = open("hello.txt", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
//这样写更简洁 fd = open("hello.txt" , O_CREAT | O_RDWR , 10705);
if (fd)
{
/* 写入 Hello, software weekly 字符串 */
write(fd, "Hello, Software Weekly", strlen("Hello, software weekly"));
close(fd);
}
fd = open("hello.txt", O_RDWR);
len = read(fd, str, LENGTH); /* 读取文件内容 */
str[len] = '\0';
printf("%s\n", str);
close(fd);
return 0;
}
头文件简介:
- #include <sys/types.h>:是Unix/Linux系统的基本系统数据类型的头文件,含有size_t,time_t,pid_t等类型。
- #include <sys/stat.h>:其中的函数可轻松获取文件属性,stat函数可以返回一个结构,里面包括文件的全部属性。
- #include <fcntl.h>:fcntl.h头文件定义了文件操作等所用到的相关宏。如O_creat、O_RDONLY、O_RDWR...
如何查陌生的库函数来源于哪个头文件?
如果不懂函数来源于哪个头文件,可使用man命令。
man命令的用法:1. man 2 <系统调用> 2.man 3 <库函数>
Linux 文件API的更多相关文章
- Linux文件权限;ACL;Setuid、Setgid、Stick bit特殊权限;sudo提权
相关学习资料 http://blog.sina.com.cn/s/blog_4e2e6d6a0100g47o.html http://blog.csdn.net/aegoose/article/det ...
- Linux文件io--one简述
什么是文件IO IO就是input/output,输入/输出.文件IO的意思就是读写文件. 文件操作的主要接口API 什么是操作系统API (1)API是一些函数,这些函数是由linux系统提供支持的 ...
- Linux文件 I/O 介绍
Linux文件 I/O 介绍 1. Linux系统调用 Linux系统调用(system call)是指操作系统提供给用户程序的一组"特殊接口",用户程序可以通过这组"特 ...
- Linux文件的IO操作 一
系统调用 系统调用: 操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务 为什么用户程序不能直接访问系统内核提供的服务 为了更好地保护内核空间, ...
- [apue] linux 文件访问权限那些事儿
前言 说到 linux 上的文件权限,其实我们在说两个实体,一是文件,二是进程.一个进程能不能访问一个文件,其实由三部分内容决定: 文件的所有者.所在的组: 文件对所有者.组用户.其它用户设置的权限访 ...
- Linux文件IO操作
来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
- Linux文件查找.md
Linux 文件查找 在Linux系统的查找相关的命令: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查询文件名称 w ...
- HTML5权威指南--标签新变化,文件API,拖放API(简要学习笔记一)
1.标签元素更加语义化 2.内容类型仍然为“text/html” 扩展符仍然为html或者htm. <1>DOCTYPE 声明<!DOCTYPE html>就可 ...
随机推荐
- 关于回调(callback)
如果要理解回调,需要在分同步通信.异步通信的基础上了解 举个通俗的例子: 你打电话问书店老板有没有<JS>这本书,如果是同步通信机制,书店老板会说,你稍等,"我查一下" ...
- Java 执行CMD/DOS
最近在写一个自己的邮箱服务器里用到 监视及起/停 windows 中的服务,调查发现还是得用dos来做这些事情 说一下遭遇战的过程 首先是java里如何执行DOS命令,查到下记函数 Runtime.g ...
- c语言的typedef
一.typedef作用简介 1.作用:给已经存在的类型起一个新的名称 2.使用场合: 1> 基本数据类型 2> 指针 3> 结构体 4> 枚举 5> 指向函数的指针 * ...
- 深入浅出多线程——ReentrantLock (二)
深入浅出多线程——ReentrantLock (一)文章中介绍了该类的基本使用,以及在源码的角度分析lock().unlock()方法.这次打算在此基础上介绍另一个极为重要的方法newConditio ...
- Servlet&JSP-HTTP报文头获取及应用
完整代码请参考:https://github.com/devway9/java-exercise/tree/master/servlet-jsp 目录 1 HttpServletRequest获取报文 ...
- TCP/IP 协议栈 -- 编写UDP客户端注意细节
上节我们说到了TCP 客户端编写的主要细节, 本节我们来看一下UDP client的几种情况,测试代码如下: server: #include <stdio.h> #include < ...
- angular指令监听ng-repeat渲染完成后执行自定义事件方法
今天工作中遇到需要用到ng-repeat遍历渲染完后执行某个操作,angular本身并没有提供监听ng-repeat渲染完成的指令,所以需要自己创建自定义指令. 在ng-repeat模板实例内部会暴露 ...
- CCF-201409-1-相邻数对
问题描述 试题编号: 201409-1 试题名称: 相邻数对 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. ...
- websocket-php
下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...
- OI大佬博客集
郭家宝:byvoid 早年大牛,题解更新到2014年,其博客内容非常丰富,不止题解 hzwer:hzwer 从OI到ACM,一直在更新 陈立杰:WJMZBMR 无需解释,不过貌似只更到2015 顾森 ...