linux 文件编程c语言操作系统调用函数总结(一)

#include <fcntl.h>
int open(const char *path, int oflag, ... /* mode_t mode */ );
int openat(int fd, const char *path, int oflag, ... /* mode_t mode */ );

open函数调用成功返回打开文件的文件描述符,失败时返回-1。oflag参数表明打开文件的状态标志,必须且只能包含以下5个标志中的一个:

O_RDONLY:只读打开

O_WRONLY:只写打开

O_RDWRONLY:读写打开

O_EXEC: 只执行打开

O_SEARCH:只搜索打开,仅用于目录

除了这些标志以外,还有一些标志为可选选项

O_APPEND: 在文件末尾写入,有此选项存在时,文件每次写入都是以文件末尾为基准添加内容,不可以修改已写入的内容

O_CREAT: 文件不存在时,创建文件

O_EXCL:与O_CREAT同时出现时,如果文件已存在,调用出错

O_FOLLOW: 如果path是一个符号链接,则调用出错

O_TRUNC:如果文件存在,则将文件长度清为0打开

O_SYNC:每次写操作要等待物理IO操作完成,包括该写操作引起的文件属性(如文件长度)更新所需的IO

O_DSYNC:每次写操作要等待物理IO操作完成,但是如果该写操作并未引起文件属性的改变,则不需要等待文件属性文件属性更新。

当文件打开模式中包含O_CREAT时,还必须提供所创建文件的权限

#include <unistd.h>
int close(int fd);

close函数关闭打开的文件,进程结束时,系统会自动关闭打开的文件,但如果进程未结束时候则应及时关闭打开的文件,因为系统为每个进程打开的最大文件数目有限制

#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

lseek函数用来定位文件的位置,offset参数说明文件指针相对于whence移动多少个字节,whence参数有SEEK_SET,SEEK_CUR,SEEK_END三个标志,分别表示文件的首部,当前位置,尾部。当文件以O_APPEND参数打开时,该函数的这三个标志永远相同,都为文件尾部,而且,offset不能为负,即不能修改已写入的文件。由于lseek函数的offset参数可正可负,因此lseek失败时返回值为-1,其他返回值都有可能是成功的返回。

此外,lseek函数只是移动文件指针,并未引起任何的IO操作,该文件指针的位置引用于下一个IO操作

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);

read函数从fd文件中读入nbytes字节的内容到buf中,成功时返回读入的字节数(有可能小于nbytes),遇到文件末尾是返回0,失败时返回-1

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);

write函数将buf中的nbytes字节内容写入fd文件中,成功时返回写入的字节数,失败时返回-1.通常情况下返回值都等于nbytes,否则出现了某些错误

#include <unistd.h>
ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);
ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);

出错时返回-1,成功时返回读/写的字节数

pread函数相当于先调用lseek再调用read,但是两者有重要区别,一是pread属于原子操作,不可拆分,而先调用lseek在调用read则两次调用中间文件可能被其他进程修改;二是pread不更新当前文件的偏移量

#include <unistd.h>
int dup(int fd);
int dup2(int fd, int fd2);

出错时返回-1,成功时返回新的文件描述符

dup为已经打开的文件返回一个新的文件描述符,该文件描述符一定是当前可用文件描述符中的最小值。dup2则是用fd2参数指定新的文件描述符,如果fd2所指文件已打开,则先关闭fd2所指文件;若fd等于fd2,则返回fd2而不关闭它。

#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */ );

出错时返回-1,成功时依赖于cmd

fcntl函数可以获得/修改文件的属性

cmd = F_DUPFD:复制文件描述符fd,返回新的文件描述符,它是尚未打开的文件描述符中大于或等于第三个参数的最小值

cmd = F_GETFD:返回fd

cmd = F_SETFD:设置新的文件描述符为第三个参数,

cmd = F_GETFL:返回文件状态标志

cmd = F_SETFL:设置文件状态标志(此时需要先得到旧的文件状态标志,与需要设置的文件状态标志按位做 | 运算,否则会将旧的文件标志所有位置清除

时间: 2024-07-28 23:30:34

linux 文件编程c语言操作系统调用函数总结(一)的相关文章

多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)

readme.txt //作为一个程序员,我们咋么能不写用户手册呢!MSP的我觉得用户体验是王道,苹果手机的用户体验的确不错!不过WP加油!我去,扯远了!赶紧看我的程序吧!  歡迎使用多功能電子通訊錄V1.0版本        如有BUG敬請原諒     make  之後便可以使用     ./ebook  運行本程序     make clean 清理本程序中間文件     make cleanall 清除所有非源程序文件 PS:我本想直接给大家看代码的,但是在这个过程中,重要不仅仅是代码,首

Linux文件编程实例

//捕获fopen调用中的错误 #include <stdio.h> #include <errno.h> #include <string.h> #define MYFILE "missing.txt" int main(  ) { FILE* fin; fin=fopen( MYFILE,"r" ); if( fin==(FILE*)NULL ) { printf( "%s: %s\n",MYFILE,st

Linux环境编程之进程(三):函数间跳转

引言:在编写程序时,经常在函数内部使用goto语句来跳转,从而进行出错处理,那么如果想要在函数之间进行跳转该怎么做呢?使用setjmp和longjmp函数. 给出示例程序: #include <stdio.h> #include <stdlib.h> #include <setjmp.h> static void f1(int, int, int, int); static void f2(void); static jmp_buf jmpbuffer; static

8.Linux文件编程

文件描述符: ????在Linux系统中,所有打开的文件对应一个数字,这个数字我们称为:文件描述符. 下面我们通过下面的几个函数来入门: 打开文件: 在命令行执行:man open.得到下面的信息. 我们从帮助文档知道:open函数的功能是:open and possibly create a file or device.该函数有两种形式存在: int open(const char *pathname, int flags); int open(const char *pathname, i

Linux文件的I/O操作

C标准函数与系统函数的区别 标准函数printf调用应用层api,然后应用层api调用内核层api,再通过内核层api调用硬件设备 一个pirntf打印helloworld那么sys_write需要输出几次到显示设备? Printf把helloworld送到缓冲区,然后由"文件表述符一次执行一个字符"一共10次 然后送到缓冲区,再有sys_write一次输出到显示设备 I/O缓冲区 每一个FILE文件流都有一个缓冲区buffer,默认大小8192Byte. 文件描述符 一个进程默认打开

Linux应用编程之串口操作20170901

主要介绍在Linux应用程序下对串口的操作: 1.串口初始化 int InitCom() { int Ret; Ret = SerailComm.OpenCom( ComPortDevPath, 0 ); if( Ret < 0 ) { return Ret; } if(SerailComm.SetComSpeed( ComBaudRate ) < 0 ) { SerailComm.CloseCom(); return Ret; } if(SerailComm.SetComParity(8,

Linux网络编程中tcp_server和tcp_client函数的封装

本文的主要目的是将server套接字和client套接字的获取,做一个简易的封装,使用C语言完成.   tcp_server   服务器端fd的获取主要分为以下几步: 1.创建socket,这一步仅仅创建一个socket,没有任何特性的属性. 2.绑定网卡和port,一块主机可能有多块网卡,如果我们使用INADDR_ANY,意味着后面接受的TCP连接可以绑定在任意一块网卡上. 例如某台主机的ip地址有两个:192.168.44.136.10.1.1.4,假设绑定的ip采用INADDR_ANY,端

5.Linux文件和目录相关操作

一.目录管理:        cd, pwd, ls  都是来查看目录的 mkdir: make directory  创建目录            -p: 当指定的目标目录的父目录不存在时,则先创建之            -p, --parents              no error if existing, make parent directories as needed      -v, --verbose              print a message for e

linux文件误删除后恢复操作

感言:一失足成千古恨,一不小心就把/usr/bin下所有的命令都删除了,还好这只一个测试环境,当在操作时,一下手快就犯错...... 恢复过程:(以下是在vsphere下管理的VM)1.关闭虚拟机 -->  在BIOS设置CD启动 --> 加载CentOS7的ISO --> 启动 2.选择troubleshooting 3.进程救援模式 4.救援模式中选择继续 5.无法切换root,查看bin文件是否存在,把相应的命令copy过去 6. 重启:init 6 以下是查找解决方法同时找到一个