看了好几周,终于把apue的文件IO看完了。不管掌握的老不牢固,先在这里总结一下自己这些天的学习经验与收获。
首先是int open()函数,这个函数式打开或者创建一个文件。返回一个文件标示符,(PS: 系统默认运行时有三个文件标识符,0代表STDIN,1代表STDOUT,2代表ERROR这个很常用的三个,所以我谨记);文件标识符其实就是一个文件指针指向了一些和打开的当前文件有关的文件属性的数据结构。具体open的参数设置大家可以参照apue里面设置。
Int creat()该函数是创建一个文件,返回该文件的标识符。但是这个函数只能创建只写文件,如果要写文件然后读文件的话,我们需要依次调用creat(),clouse(),open()。
Close()函数是关闭一个文件的函数。错误返回-1
Read() 函数是一个成功返回读取字节数的函数。返回0时是已经读到了文件的最末端。
Write()函数是往文件里面写数据的函数。返回值是已写的字节数。他出错的原因有两个。一是所写磁盘已经写满,二是超过了给定进程的文件长度限制。对于文件来说,写操作是从当前文件的offset既是当前偏移量出开始写。
Lseek()函数挺重要的吧。就是设置当前打开文件的偏移量。也就是说我们可以用这个函数来决定我们从文件的哪里开始进行操作。
以上是普通应用,下面我觉得应该是高级的应用了 、
Dup和dup2这两个函数是非常有用的。我们可以利用他们来复制了一个完全一样的文件操作符。Dup2()的第二个参数就会完全 复制第一个参数的数据结构,也就是说如下代吗说明:
oldfd=open(“hello”,(O_RDWR|O_CREATE),0666);
dup2(oldfd,1);
close(oldfd);
这段代码就是说打开一个名为hello的文件我们得到了一个文件描述符oldfd,我们利用dup2复制了一个描述符我们命名为1,然而1是默认的stdout的文件描述符,所以标准3输出的所有内容都会默认的放到hello的文件里面。这个函数通常和管道pipe()函数配合使用。在这里不过多的说明因为本人也没有很好的理解管道的概念。Dup2这个函数基本可以等于
close(filedes2);
fcntl(filedes,F_DUPFD,filedes2);
但是区别就是dup2()是一个原子操作,可以避免进程或线程的崩溃。另外fcntl还可以用来 设置一个文件的记录锁。也是很常用的。具体的函数参数的传递我们可以去参阅他们的英文手册。Man 也可以在线的查阅!
小结:本人十分热爱UNIX。在开源社区看到大家在做的开源项目真的感觉很好。无论以后做什么工作,我也会把UNIX学习到底,作为一种兴趣,更是希望自己也可以能写出好的代码!所以现在要努力的学习。我们大家一起共同努力!不要为了追逐名利的去学习!
联系客服