- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- int open(const char *pathname, int flags);
- #include <unistd.h>
- int close(int fd);
- #include <unistd.h>
- ssize_t write(int fd, const void *buf, size_t count);
- #include <unistd.h>
- ssize_t read(int fd, void *buf, size_t count);
例如: #include
- #include <sys/types.h>
- #include <unistd.h
- off_t lseek(int fd, off_t offset, int whence);
- du filename #查看文件所占实际磁盘空间
- ls filename #实际文件的大小
例如:
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #define BUFF 12
- int main()
- {
- char str1[BUFF] = "jigntikai";
- char str2[BUFF] = "wojisuhihawe";
- int fd;
- if ( (fd = open("a.txt",O_WRONLY|O_CREAT,0744)) =
- {
- perror("open file fail\n");
- exit(EXIT_FAILURE);
- }
- if( write(fd,str1,BUFF) == -1 )
- {
- perror("write fial fail\n");
- exit(EXIT_FAILURE);
- }
- if( lseek(fd,1024,SEEK_END) == -1 )
- {
- perror("lseek fail\n");
- }
- write(fd,str2,BUFF);
- return 0;
- }
- #include <unistd.h>
- int access(const char *pathname, int mode);
- #include <unistd.h>
- int dup(int oldfd);
在此简单介绍一下文件的内核结构:首先计算机系统中有一个进程表,其中的每个进程表项,该表项中有一个打开文件描述符表,该打开的文件描述表中有很多文件描述符表项,每项包括两部分:文件描述符标志与文件指针,其中文件指针指向一个文件表,文件表中存放着文件的状态标志即是否可读是否可写,当前文件的偏移量,还有一个 v 节点指针,指针 v 节点指针指向一个 v 节点表,v 节点表主要存放文件的所有者,文件长度,文件的设备以及文件实际数据块在磁盘上的位置等一系列信息。可能这样描不太清楚,下面用一张图来描述:
(对于以下会主要是针对的内核缓冲)由于 io 操作会首先将数据放入内核缓冲区,所以在写的时候如果出现系统故障则缓冲区的数据可能会丢失,所以为了防止这种情况发生,以上两个函数使得内核缓冲区的数据立即写入磁盘。
- #include <unistd.h>
- void sync(void);将所有缓冲排入写队列,然后立即返回
- int fsync(int fd);将所有缓冲排入写队列,直到该缓冲去的数据写入磁盘后才返回。
- int fdatasync(int fd);几乎和fsync函数相同,只是fdatasync(int fd)函数只影响数据部分,而fsync还会同步更新文件的属性。
- #include < unistd.h > #include < fcntl.h > int fcntl(int fd, int cmd, ...
- /* arg */
- );
- dup(fd)等价于 fcntl(fd,F_DUPFD,0) dup2(oldfd,newfd)等价于 close(newfd); fcntl(oldfd,F_DUPFD,newfd);
例如:
- #include <stdio.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <stdlib.h>
- int main(int argc,char * argv[])
- {
- int fd;
- int val=3;
- if( (fd = open(argv[1],O_RDWR|O_APPEND)) == -1 )//测试一下是否可以同时检测出文件的读写属性
- {
- exit(2);
- }
- if( val = fcntl(fd,F_GETFL,0) == -1 )
- {
- exit(1);
- }
- printf("%d\n",val);
- printf("%d %d %d\n",O_RDONLY,O_WRONLY,O_RDWR);
- int n = val & O_ACCMODE;
- if( n == O_RDONLY)
- printf("read\n");
- if(O_WRONLY & val )
- printf("write\n");
- if( n == O_RDWR)
- printf("read and write\n");
- }
linux 中有两个级别的缓冲:IO 缓冲与内核缓冲
- 目的:减少对磁盘的读写次数,提高工作效率。
来源: http://blog.csdn.net/qq_36675830/article/details/78938412