Linux 系统调用(system call)是指操作系统提供给用户程序的一组“特殊接口”,用户程序可以通过这组“特殊”接口来获得操作系统提供的特殊服务。 注意:每个程序中打开的文件系统会单独分配文件描述符,互相不影响 open函数用来创建或者打开一个文件: 以只写的方式打开1.txt。如果文件不存在就创建,如果文件存在就清空。
以读写方式打开文件1.txt。如果文件不存在则创建,如果文件存在则报错:
close函数用来关闭一个打开的文件: read函数用来从文件中读取数据: 从指定的文件(文本文件)中读取内容并统计大小
write函数用来向文件写入数据: 将键盘输入的内容写入文件,直到输入quit结束:
lseek函数用来定位文件: opendir函数用来打开一个目录文件: readdir函数用来读取目录流中的内容: closedir用来关闭一个目录文件: 打印指定目录下所有文件的名称:
chmod/fchmod函数用来修改文件的访问权限: struct stat是存放文件属性的结构体类型: st_mode通过系统提供的宏来判断文件类型: 获取并显示文件属性:
不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,用知识来改变命运,用博客见证成长,用行动证明我在努力。
为了更好的保护内核空间,将程序的运行空间分为内核空间和用户空间,他们运行在不同的级别上,在逻辑上是相互隔离的。在 Linux 中,用户程序不能直接访问内核提供的服务,必须通过系统调用来使用内核提供的服务。
Linux 中的用户编程接口(API)遵循了 UNIX 中最流行的应用编程界面标准—— POSIX。这些系统调用编程接口主要是通过 C 库(libc)实现的。
往期传送门:
史上最全的Linux常用命令汇总(超详细!超全面)这一篇就够了
Linux下标准IO的这些操作你清楚吗(内附有详细的介绍和例程)文章目录
文件I/O简介
文件描述符
文件I/O与标准I/O区别
标准I/O
文件I/O
ANSIC
POSIX
带缓冲(减少系统调用次数)
无缓冲(
读写文件需要进行系统调用
)
流(FILE结构体)打开文件
文件描述符
表示一个打开的文件打开文件(open)
#include <fcntl.h> int open(const char *path,int oflag,...); //参数1:打开文件路径 参数2:打开方式
示例1:
int fd; if((fd=open("1.txt",O_WRONLY|O_CREAT|O_TRUNC,0666))<0 { perror("open"); return -1; }
示例2:
int fd; if((fd=open("1.txt",O_RDWR|O_CREAT|O_EXCL,0666))<0) { if(errno==EEXIST) { perror("exist error"); } else { perror("other error"); } }
关闭文件(close)
#include <unistd.h> int close(int fd);
读取文件(read)
#include <unistd.h> ssize_t read(int fd,void *buf,size_t count);
示例
#include <stdio.h> #include <unistd.h> int main(int argc,char *argv[]) { int fd,n,total=0; char buff[64]; if(argc<2){ prinff("Usage:%s<file>n",argv[0]; return -1; } if((fd=open(argv[1],O_RDONLY))<0){ perror("open"; return -1; } while((n=read(fd,buf,64))>0){//读取64个字节到buf中并保存返回值到n total+=n;//total的值即为文件的大小 } printf("size:%dn",total); return 0; }
写入文件(write)
#include <unistd.h> ssize_t write(int fd,void *buf,size_t count);//buf写入内容;count写入大小
示例
#include <stdio.h> #include <unistd.h> #include <string.h> int main(int argc,char *argv[]) { int fd; char buf[20]; //只写方式打开文件,如果文件不存在创建,如果文件存在则清空 if((fd =open(argv[1],O_WRONLY|OCREAT|O_TRUNC,0666))<0{ perror("open"); return -1; } while(fgets(buf,20,stdin)!=NULL){ if(strcmp(buf,"quitn")==0)break; write(fd,buf,strlen(buf)); }
定位文件(lseek)
#include <unistd.h> off_t lseek(int fd,off_t offset,intt whence);
访问目录(opendir/readdir)
#include <dirent.h> DIR *opendir(const char *name);
#include <dirent.h> struct sirent *readdir(DIR *dirp);
char d_name[256]
等成员关闭目录(closedir)
#include <dirent.h> int closedir(DIR *drip);
示例:
#include <stdio.h> #include <dirent.h> int main(int argc,char *argv[]) { DIR *drip; struct dirent *dp; if(argc<2){ printf("Usage :%s<directory>n"argc[0]);return -1; } if((dirp=opendir(argv[1]))==NULL){ perror("opendir"); return -1; } while((dp=readdir(dirp))!=NULL){ printf("%sn",dp->d_name); } closedir(dirp); return 0; }
修改文件属性(chmod/fchmod)
#include <sys/stat.h> int chmod(const char *path,mode_t mode); int fchmod(int fd,mode_t mode);
获取文件属性(stat/lstat/fstat)
#include <stdio.h> int stat(const char *path,struct stat *buf); int lstat(const char *path,struct stat *buf); int fstat(int fd,struct stat *buf);
结构体类型
作用
mode_t st_mode
类型和访问权限
uid_t st_uid
所有者id
uid_t st_gid
用户id
off_t st_size
文件大小
time_t st_mtime
最后修改时间
通过(st_mode&0170000)计算后得到的值和以下进行匹配
文件类型
计算值
S_ISREG(st_mode) 普通文件
0100000
S_ISDIR(st_mode)目录文件
0040000
S_ISCHR(st_mode)
0020000
S_ISBLK(st_mode)
0060000
示例
#include <stdio.h> #include <unistd.h> #include <time.h> #include <sys/types.h> #include <sys/stat.h> int main(int argc,char *argv[]) { struct stat buf; struct tm *tp;//获取本地时间的指针 int n; if(argc<2) { printf("Usage:%s <file>n",argv[0]); return -1; } if(lstat(argv[1],&buf)<0) { perror("lstat"); return -1; } switch(buf.st_mode&S_IFMT) { case S_IFRGE: printf("-"); break; case S_IFDIR: printf("d");//是一个目录文件 break; } for(n=8;n>=0;n--) { if(buf.st_mode&(1<<n)) { switch(n%3) { case 2: printf("r"); case 1: printf("w"); break; case 0: printf("x"); break; } } else { printf("-"); } } printf("%lu",buf.st_size); tp=localtime(buf.st_mtime);//转换为本地时间 printf("%d-%02d-%02d",tp->tm_year+1900,tp->tm_mon+1,tp->tm_mday);//年月日 天数 printf("%sn",argc[1]); return 0; }
如果我的博客对你有帮助、如果你喜欢我的博客内容,记得“” “评论” “”一键三连哦!听说的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算