设为首页 收藏本站
查看: 755|回复: 2

[经验分享] Linux的文件I/O编程

[复制链接]

尚未签到

发表于 2013-6-27 09:00:25 | 显示全部楼层 |阅读模式
#include <fcntl.h>
int open(const char *pathname, int oflag)
oflag:
以下三个标志必须指定一个且只能指定一个
  • O_RDONLY : 只读打开
  • O_WRONLY : 只写打开
  • O_RDWR : 读写打开

以下标志可选,用与运算符(|)和其他标志结合
  • O_APPEND:每次写的数据都添加到文件尾
  • O_TRUNC:若此文件存在,并以读写或只写打开,则文件长度为0
  • O_CREAT:若文件不存在,则创建该文件。此时,open函数需要第三个参数,用于指定该文件的访问权限位(后面描述)
  • O_EXCL:若同时指定了O_CREAT标志,而文件已经存在,则会出错。可用于测试文件是否存在

成功时返回文件描述符,失败返回-1。

int creat(const char *pathname, mode_t mode)
mode与open的oflag相同,返回只写打开的文件描述符。若文件存在,调用creat会清空文件。
可以用open实现creat。
off_t lseek(int filedes, off_t offset, int whence)
filedes为文件描述符,offset为相对偏移量,whence可取SEEK_SET、SEEK_CUR、SEEK_END三值之一。
成功则返回现在的偏移量,失败返回-1。
lseek的偏移量若超过文件长度,则会加长文件,并在中间形成空洞。读空洞部分结果均为0。
ssize_t read(int filedes, void *buff, size_t nbytes)
ssize_t write(int filedes, void *buff, size_t nbytes)
buff指向缓冲区,nbytes指定读出/写入的字节数。
返回实际读出/写入的字节数,读到文件末尾则返回0,写入失败返回-1。
由于Linux的预读机制,buff大小一般最好取4096。
int close(int filedes)
关闭文件,成功返回0,失败返回-1。
int dup(int filedes)
int dup2(int filedes, int filedes2)
复制文件描述符,返回新的描述符。
dup返回的总是当前可用描述符中的最小值,而dup2可以指定新的描述符。若filedes2已经打开,则dup2会将其先关闭,除非filedes2==filedes。
void sync(void)
将缓冲区中修改过的数据排入写队列,然后返回,不等待写入完成。
int fsync(int filedes)
对指定文件起作用,且等待写入完成。
写入失败返回-1,成功返回0。
int fdatasync(int filedes)
与fsync类似,但不更新文件属性,仅修改数据部分。
int fcntl(int filedes, int cmd, ...)
cmd取值:
  • F_DUPFD:类似dup2函数,复制filedes到大于等于第三参数的最小可用描述符并返回该描述符。它不是原子操作,可能被打断。
  • F_GETFD:返回filedes对应的文件描述符标志(FD_CLOEXEC)。
  • F_SETFD:按照第三个参数设置filedes对应的文件描述符标志。
  • F_GETFL:返回filedes对应的文件状态标志(O_RDONLY、O_WRONLY、O_RDWR、O_APPEND、O_NONBLOCK、O_SYNC、OASYNC)
  • F_SETFL:将第三个参数设置为文件状态标志,不能改变前三项(只读、只写、读写)。
  • F_GETOWN:获取当前接收SIGIO和SIGURG信号的进程ID或进程组ID。
  • F_SETOWN:将第三个参数设置为接受SIGIO和SIGURG信号的进程ID或进程组ID。若第三个参数大于0,表示进程ID;小于0则其绝对值表示一个进程组ID。


int stat(const char* restrict pathname, struct stat* restrict buf)
int fstat(int filedes, struct stat* buf)
int lstat(const char* restrict pathname, struct stat* restrict buf)
将文件属性传入buf,restrict关键字表明该指针是访问一个数据对象的唯一且初始的方式。
struct stat {
        ino_t              st_ino;           /* inode number*/
        mode_t       st_mode;     /* file type & mode */
        nlink_t            st_nlink;         /* number of hard links */
        uid_t              st_uid;           /* user ID of owner */
        gid_t              st_gid;           /* group ID of owner */
        off_t              st_size;          /* total size, in bytes */
        unsigned long      st_blksize;       /* blocksize  */
        unsigned long      st_blocks;        /* number of blocks allocated
        time_t             st_atime;         /* time of last access */
        time_t             st_mtime;    /* time of last modification */
        time_t             st_ctime;         /* time of inode last change
};

使用如下的宏判断文件类型

普通文件          S_ISREG()
目录文件          S_ISDIR()
字符特殊文件     S_ISCHR()
块特殊文件          S_ISBLK()
FIFO文件          S_ISFIFO()
套接口文件          S_ISSOCK()
符号连接          S_ISLINK()
int utime(const char* pathname, const struct utimbuf *times)修改文件的访问时间和修改时间。
struct utimbuf {
      time_t actime;          //访问时间
      time_t modtime;     //修改时间

};
int access(const char* pathname, int mode)
测试文件许可权限。成功返回0,失败返回-1。
mode取值:
  • R_OK         测试读许可权
  • W_OK        测试写许可权
  • X_OK         测试执行许可权
  • F_OK         测试文件是否存在

成功返回0,失败返回-1。

mode_t umask(mode_t cmask)
创建屏蔽字,参与指定文件的访问权限。
cmask取0即由open和creat指定权限,取(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)即禁止所有组和其他用户的访问权限。

int chmod(const char* pathname, mode_t mode)
int fchmod(int filedes, mode_t mode)

修改文件存取权限。
mode取值:

int chown(constchar* pathname, uid_t owner, gid_t group)
修改文件的用户ID和组ID。
int truncate(const char* pathname, off_t length)
int ftruncate(int fd, off_t length)
修改文件长度。
若length小于文件长度,则超出部分消失;若length大于文件长度,则中间形成空洞,读取空洞总是得到0。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-6774-1-1.html 上篇帖子: Linux下防止文件误删方法 下篇帖子: Linux下做双向同步 Linux

尚未签到

发表于 2013-8-8 14:45:58 | 显示全部楼层
自从我变成了狗屎,就再也没有人踩在我头上了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

累计签到:1 天
连续签到:1 天
发表于 2013-11-28 11:10:42 | 显示全部楼层
这世上除了自己,并没有完全值得信赖的东西。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表