寒假学习 第七、八天 (linux 高级编程) 笔记 小结
一、IO基础
1.认识内核对象
系统不允许程序直接访问设备和内存,但可以通过内核系统函数去访问,系统对每个内核对象对象分配ID号。
程序要访问内核对象,只能通过ID号来访问。(申请得到一个ID ,在内核系统函数中使用ID得到对应内核对象数据)。
2.怎么访问文件
使用函数传递一个文件,系统打开文件,返回给程序ID号,程序通过ID号来访问文件,通过ID号来告诉系统释放文件。
( ID:文件描述符号.file description (fd) )
3.每个程序默认打开三个文件设备
每个程序运行时 在/proc/ pid /fd / 下有三个 文件描述符号
lrwx------ 1 root root 64 1月 22 21:41 0 -> /dev/pts/4
lrwx------ 1 root root 64 1月 22 21:41 1 -> /dev/pts/4
lrwx------ 1 root root 64 1月 22 21:41 2 -> /dev/pts/4
lrwx------ 1 root root 64 1月 22 21:41 1 -> /dev/pts/4
lrwx------ 1 root root 64 1月 22 21:41 2 -> /dev/pts/4
他们都指向当前终端
但一般默认
0:标准输入
1:标准输出
2:错误输出
1:标准输出
2:错误输出
4.操作文件描述符号
ssize_t write(int fd, void *buf,//要写入内核对象的数据 size_t size);//写入数据大小 返回: >0 实际写入的数据 -1 写入错误 ssize_t read(int fd, void *buf,//返回数据的空间 size_t size);//空间大小 返回: >0:实际读取的数据 =0:碰到文件结束符号EOF (ctrl+d) -1:读取错误
通过 write 跟 read 来访问
4、文件的类型 和 权限
文件类型
目录文件d
普通文件f
字符设备文件c
块设备文件b
软连接文件l
管道文件psocket文件s
权限
rwx 就不多说了s/S用来当程序执行时有s设置所设置的权限2:组设置位 设置位向其他用户开放拥有者权限的权限.用户设置位4:用户设置位 设置位向其他用户开放组用户权限的权限.组用户设置位为什么分大小写见下面t/T中说的t/T粘着位(只针对目录有效)粘着位:一个文件可读写的用户并一定相让他有删除此文件的权限,如果文件设置了t权限则只用属主和root有删除文件的权限,通过chmod +t filename 来设置t权限。因为 显示权限时 t/T 要占用 x 权限的位置 说以 用t 表示设置粘着位 并且 有 x 权限,T表示设置粘着位但 没有 有 x 权限。详细的解释 http://hi.baidu.com/reyleon/item/e27650e588a1ce0a8e3ea891
5.通过文件描述符号读写各种数据
open函数与creat函数 int open( const char *filename,//文件名 int flags,//open的方式[创建/打开] mode_t mode//权限(只有创建的时候有效) ) 返回: >=0:内核文件描述符号. =-1:打开/创建失败 open的方式: 必选方式:O_RDONLY O_WRONLY O_RDWR,必须选择一个 创建/打开:O_CREAT 可选方式: 对打开可选方式:O_APPEND O_TRUNC(清空数据) 对创建可选方式:O_EXCL 组合: 创建: O_RDWR|O_CREAT O_RDWR|O_CREAT | O_EXCL 打开: O_RDWR O_RDWR|O_APPEND O_RDWR|O_TRUNC 权限: 建议使用8进制数 关闭 void close(int fd);
列子:
写入数据到stu.dat中去
#include<stdio.h> #include<unistd.h> #include<fcntl.h> struct stu { char name[20]; int age; char c; }; void input(struct stu* p_s) { printf("Plase input:\n"); printf("name:"); scanf("%s",p_s->name); printf("age:"); scanf("%d",&p_s->age); printf("sex:"); getchar(); scanf("%c",&p_s->c); getchar(); } int main() { int r=open("stu.dat",O_WRONLY|O_CREAT|O_EXCL,0666); struct stu s; char t; while(1) { input(&s); write(r,&s,sizeof(s)); printf("Next?"); scanf("%c",&t); if(t==‘N‘||t==‘n‘){ break; } system("clear"); } close(r); }
读取stu.dat 中的数据
#include<stdio.h> #include<unistd.h> #include<fcntl.h> struct stu { char name[20]; int age; char c; }; int main() { int r=open("stu.dat",O_RDONLY); int t; struct stu s; while(1) { t=read(r,&s,sizeof(s)); printf("t=%d\n",t); if(t==0||t==-1) break; printf("%s\t%d\t%c\n",s.name,s.age,s.c); } }
防止输出被重定向
int isatty(int fd) 用来判定文件描述符号与终端的邦定关系
返回非0 fd输出终端 ,返回0 fd输出被重定向
2.可以用 /dev/tty
吧要输出的东西输出到 /dev/tty