UNIX/Linux中的文件描述符 && 为何删除DB2的容器之后表空间仍然可以访问
来源:互联网 发布:泉方pubmed数据库 编辑:程序博客网 时间:2024/06/06 19:06
大多数UNIX文件I/O只需用到5个函数open,read,write,lseek,close。当使用open或者create函数打开或创建一个新文件时,内核向进程返回一个文件描述符,文件描述符是一个非负整数(也就是open/create函数的返回值,如果小于0,则出错)。当读、写文件时,read/write函数使用参数的是文件描述符,而非文件名。UNIX/LINUX shell中,文件描述符0代表标准输入,1代表标准输出,2代表标准错误。
看下面这个例子(例子略,等我补上)
qingsong@db2a:/tmp$ echo this is a test line > input.txt
qingsong@db2a:/tmp$ exec 3<input.txt
之后就可以使用它:
qingsong@db2a:/tmp$ cat <&3
this is a test line
创建文件描述符用于写入(对应于文件打开模式中的截断模式)
qingsong@db2a:/tmp$ exec 4>output.txt
之后就可以使用它:
qingsong@db2a:/tmp$ cat<<EOF>&4
> Hello,world
> line 2
> EOF
qingsong@db2a:/tmp$ cat output.txt
Hello,world
line 2
这里的cat<<EOF>&4意思是从标准输入中读取,然后重定向到文件描述符4,EOF可以换成其他字符串,习惯上使用EOF
创建文件描述符用于追加(对应于文件打开模式中的追加模式:
qingsong@db2a:/tmp$ exec 5>>output.txt
使用文件描述符:
qingsong@db2a:/tmp$ echo line three >&5
qingsong@db2a:/tmp$ cat output.txt
Hello,world
line 2
因为程序是通过文件描述符操纵的文件,而不是文件名。你删了文件,实际上只是删了个文件名,文件描述符还是打开状态,真正的文件数据还没被删除,不信,你看:
inst105@db2a:~$ echo this is a test line > input.txt
inst105@db2a:~$ exec 3<input.txt
inst105@db2a:~$ rm input.txt
inst105@db2a:~$ ls input.txt
ls: cannot access input.txt: No such file or directory
inst105@db2a:~$ cat <&3
this is a test line
文件已经被“删掉”了,还能通过文件描述符访问
看下面这个例子(例子略,等我补上)
<坑,待填>
例1,将命令输出中的错误信息丢弃
可以参考之前的文章:http://blog.csdn.net/qingsong3333/article/details/77489263
例2,用exec命令创建自己的文件描述符
创建一个文件描述符进行文件读取(对应于文件打开模式中的只读模式),使用文件描述符3打开文件input.txt:qingsong@db2a:/tmp$ echo this is a test line > input.txt
qingsong@db2a:/tmp$ exec 3<input.txt
之后就可以使用它:
qingsong@db2a:/tmp$ cat <&3
this is a test line
创建文件描述符用于写入(对应于文件打开模式中的截断模式)
qingsong@db2a:/tmp$ exec 4>output.txt
之后就可以使用它:
qingsong@db2a:/tmp$ cat<<EOF>&4
> Hello,world
> line 2
> EOF
qingsong@db2a:/tmp$ cat output.txt
Hello,world
line 2
这里的cat<<EOF>&4意思是从标准输入中读取,然后重定向到文件描述符4,EOF可以换成其他字符串,习惯上使用EOF
创建文件描述符用于追加(对应于文件打开模式中的追加模式:
qingsong@db2a:/tmp$ exec 5>>output.txt
使用文件描述符:
qingsong@db2a:/tmp$ echo line three >&5
qingsong@db2a:/tmp$ cat output.txt
Hello,world
line 2
line three
例3,
可以解释为什么删除了DB2的容器之后,表空间还是正常状态,直到重启。或者删除活动日志之后,为啥没有crash?
下面的例子中,虽然删除了表空间的容器,但表空间状态一切正常,直到重启数据库:
inst105@db2a:~$ db2 "connect to sample"inst105@db2a:~$ db2 "create tablespace tbs1 managed by database using (file '/home/inst105/con1' 5000)"inst105@db2a:~$ db2 "create table t1(id int) in tbs1"inst105@db2a:~$ db2 "insert into t1 values(100),(200)"inst105@db2a:~$ rm /home/inst105/con1inst105@db2a:~$ ls /home/inst105/con1ls: cannot access /home/inst105/con1: No such file or directoryinst105@db2a:~$ db2 "insert into t1 values(300)"DB20000I The SQL command completed successfully.inst105@db2a:~$ db2 "select * from t1"ID ----------- 100 200 300 3 record(s) selected.inst105@db2a:~$ db2 "force applications all"inst105@db2a:~$ db2 "deactivate db sample"inst105@db2a:~$ db2 "connect to sample"inst105@db2a:~$ db2 "select * from t1"ID -----------SQL0290N Table space access is not allowed. SQLSTATE=55039
因为程序是通过文件描述符操纵的文件,而不是文件名。你删了文件,实际上只是删了个文件名,文件描述符还是打开状态,真正的文件数据还没被删除,不信,你看:
inst105@db2a:~$ echo this is a test line > input.txt
inst105@db2a:~$ exec 3<input.txt
inst105@db2a:~$ rm input.txt
inst105@db2a:~$ ls input.txt
ls: cannot access input.txt: No such file or directory
inst105@db2a:~$ cat <&3
this is a test line
文件已经被“删掉”了,还能通过文件描述符访问
阅读全文
1 0
- UNIX/Linux中的文件描述符 && 为何删除DB2的容器之后表空间仍然可以访问
- linux下删除文件之后,磁盘空间仍然没有释放
- linux/unix 文件描述符的应用
- linux删除文件之后空间没有释放
- linux/unix文件描述符
- Linux下删除文件为何空间不释放
- Linux下删除文件为何空间不释放
- Linux下删除文件为何空间不释放
- Linux下删除文件为何空间不释放
- Linux 下删除了文件,空间为何不释放?
- UNIX/Linux中的文件按描述符标志或文件状态标志的修改,即 “与或非” 操作
- db2的表,表空间,表空间容器关系
- linux、unix下创建、删除表空间
- 【Linux&Unix--文件描述符与权限】
- 破坏掉数据文件后仍然可以查询,且表空间无法删除
- DB2删除完数据之后,如何释放LOB字段占用的空间
- Linux中的文件描述符
- Linux中的文件描述符
- redis 初识
- npm安装vue
- DHCP其他
- mybatis打印sql日志
- 无坑畅玩minikube(利用阿里云镜像编译minikube)
- UNIX/Linux中的文件描述符 && 为何删除DB2的容器之后表空间仍然可以访问
- log4j的配置和多日志文件生成
- 关于数据仓库的分层
- 程序员成长之路
- NYOJ题目252-01串(动态规划)
- 著名互联网公司架构设计
- 国学的天空-傅佩荣有声系列3
- Bmob实现登陆
- sublime配置evernote_markdown