linux系统编程--⽂件IO读写(⼆)
linux系统设计的核⼼理念在于⽂件。
⽂件包含两⽅⾯的内容,⼀是⽂件本⾝所储存的数据,⼆是⽂件的属性,包括⽂件的访问权限、所有者、⽂件⼤⼩、创建⽇期等。
从左到右依次是⽂件属性(⽬录也是⽂件),⽂件数量(⼦⽬录数),所有者,⽤户组,⽂件⼤⼩,⽂件创建时间,⽂件名。
linux中⽂件类型:
①普通⽂件(regular file):最常见的类型,⾄于是⽂本还是⼆进制,对内核并⽆区别。第⼀个属性是-
②⽬录⽂件:第⼀个属性是d
③字符特殊⽂件(character special file):字符类型设备,⽐如键盘,⿏标等。我猜显⽰器,打印机也应该属于这个。
④块特殊⽂件(block special file):块类型设备,如硬盘光驱等,第⼀个属性是b
⑤FIFO:⽤于进程间通信,也称为管道,第⼀个属性是p
⑥套接字(socket):⽹络通信,第⼀个属性是s
⑦ 符号连接(symbolic link):指向另⼀个⽂件,是另⼀个⽂件的引⽤。第⼀个属性是l
/bin⽬录 : ⽤于存放普通⽤户可执⾏的命令,如ls,cp等
/boot⽬录: 内核及启动系统所需要的⽂件。
/cdrom ⽬录: 光驱设备
/dev ⽬录: 设备⽂件
/etc ⽬录: 存放系统配置⽂件。
/home ⽬录: 普通⽤户主⽬录,每个⽤户在该⽬录下有⼀个与⽤户同名的⽬录
/lib : 存放各种库⽂件
/sbin: 系统管理命令
/tmp: 存放临时⽂件
/mnt : 本意是挂载⽬录,不过这⾥⾯/hgfs是虚拟机跟主机共享通信的⽬录,事实上直接拖拽⽂件进出虚拟机即可。/proc: 虚拟⽂件系统,只有在系统运⾏时才存在。
打开⽂件open
⽂件描述符: 所有执⾏I/O操作的系统调⽤都以⽂件描述符(⾮负整数)来指代打开的⽂件,为int型
open(pathname,flags,mode),返回值即为⽂件描述符。
如果⽂件不存在,open创建它。 flags参数指定打开⽅式:只读,只写或是读写。
mode参数则指定了这个创建后的⽂件的访问权限。
O_RDONLY :以只读⽅式打开
O_WRONLY: 以只写⽅式打开
O_RDWR : 可读可写
open函数有两个不同的实现,⼀个是忽略掉mode参数。
当且仅当第⼆个参数使⽤了O_CREAT时(⽂件不存在需要创建),才需要第三个参数mode
继续查⼿册:“如果成功调⽤,返回的⽂件描述符是最低编号的数字(最⼩是零),⽽不是当前打开的那个进程”还包含了3个头⽂件 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>
mode参数:
标志含义
S_IRUSR⽤户可以读
标志含义
S_IWUSR⽤户可以写
S_IXUSR⽤户可以执⾏
S_IRWXU⽤户可以读、写、执⾏
S_IRGRP组可以读
linux怎么读取文件
S_IWGRP组可以写
S_IXGRP组可以执⾏
S_IRWXG组可以读写执⾏
S_IROTH其他⼈可以读
S_IWOTH其他⼈可以写
S_IXOTH其他⼈可以执⾏
S_IRWXO其他⼈可以读、写、执⾏
S_ISUID设置⽤户执⾏ID
S_ISGID设置组的执⾏ID
X :可执⾏ R:read W:write U:user G:group O:other
实验1:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
if(open("",O_RDONLY)==-1)
{  perror(":");
exit(1);
}
return 0;
}
此时并没有⼀个叫做的⽂件存在,所以单独使⽤open会调⽤失败,出现提⽰:
No such file or directory
实验2:
#include <stdio.h>
//以只读模式打开⽂件,如果⽂件不存在,则创建⼀个可读写权限的新⽂件
int main()
{
int fd;
if(fd=(open("",O_RDONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)
{  perror(":");
exit(1);
}
close(fd);
return 0;
}
读⽂件read
需要 #include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t 就是个int型,size_t是个unsigned int ,主要是为了可移植性。
第⼀个参数为open打开的⽂件描述符,第⼆个参数是内存缓冲区的地址,第三个参数是需要读取的多少(字节)。
如果调⽤成功,read函数返回实际读取的字节数,遇到⽂件结尾(EOF)则返回0,出现错误返回-1.
⼀次read函数调⽤所读取的字节数可以⼩于请求的字节数,⽐如靠近⽂件尾部,⽐如遇到换⾏符\n,调⽤就会结束。所以当返回字节数⼩于请求的字节数的时候,要么读到了⽂件尾,要么read被信号中断了读取过程,或者是其他原因。写⽂件write
需要#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
第⼀个参数为open打开的⽂件描述符,第⼆个参数是内存缓冲区的地址,第三个参数是需要写⼊的多少(字节)。
如果调⽤成功,write函数返回实际写⼊的字节数,如果返回字节数⼩于count,称为’部分写‘。
#include <stdio.h>
#include <unistd.h>
//实验3 ,向⽂件中写⼊单个字符串
int main()
{
int fd;
char buf[20]="hello world";
if(fd=(open("",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR))==-1)      {  perror(":");
exit(1);
}
if(write(fd,buf,20)==-1)
{  perror(":");
exit(1);
}
printf("\n--------------------\nsuccess write\n");
close(fd);
return 0;
}
实验4,如果想写⼊多个字符串,修改代码为:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
//实验4,写⼊多个字符串
int main()
{
int fd;
char *buf[20]={"hello world","this","is","a test"};
if(fd=(open("",O_RDWR|O_CREAT,S_IRUSR|S_IWUSR))==-1)      {  perror(":");
exit(1);
}
if(write(fd,buf[0],20)==-1)
{  perror(":");
exit(1);
}
printf("\n--------------------\nsuccess write\n");
close(fd);
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。