第三章 进程控制 3.1.4 fork、文件和数据

来源:互联网 发布:那个房产软件好 编辑:程序博客网 时间:2024/05/16 11:52
  1. 看下面的程序:


  1. 在当前文件夹下新建了一个data.txt 文件,里面的字符数多于20,看下运行的结果:可以看出在父进程中打开的文件指针,在子进程中还是能用的,而且是公用的。

  1. 首先是 lseek( ) 函数:
头文件:
#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fildes, off_t offset, int whence);

每一个已打开的文件都有一个读写位置,当打开文件时通常其读写位置是指向文件开头, 若是以附加的方式打开文件(如O_APPEND), 则读写位置会指向文件尾。 当read()或write()时, 读写位置会随之增加,lseek()便是用来控制该文件的读写位置。参数fildes 为已打开的文件描述词,参数offset 为根据参数whence来移动读写位置的位移数。

参数 whence 可以为:
SEEK_SET 参数offset 即为新的读写位置。
SEEK_CUR 以目前的读写位置往后增加offset 个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量。

当whence 值为 SEEK_CUR 或  SEEK_END 时, 参数offet 允许负值的出现。

SEEK_SET、SEEK_CUR 和 SEEK_END 是 System V 引入的,在这之前使用的是 0、1 和 2。

返回值:当调用成功时则返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno 会存放错误代码。

所以,也就能理解上面的函数:

if((pos = lseek(fildes, 0L, 1)) < 0L) {
...
}

其中的 fildes 是已打开的文件描述,使用 open( ) 函数调用得到的。上面的 lseek 函数的第三个形参为 1 ,其实就是 SEEK_CUR ,表示 lseek 函数会以目前打开的文件指向的文件头为基准,偏移 +0 位。 

  1. read( ) 函数:从某个已打开的文件中读取一定数量的字符,然后将这些字符放入某一个预存的缓冲区内,供以后使用。
头文件:
#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

函数说明:read( )会把参数 fd 所指的文件传送 count 个字节到 buf 指针所指的内存中。 若参数count 为0, 则read()不会有作用并返回0。返回值为实际读取到的字节数, 如果返回0, 表示已到达文件尾或是无可读取的数据,此外文件读写位置会随读取到的字节移动。

所以上面的程序中的

read( fd, buf, 10) 也就好理解了。


========
参考链接:

C语言lseek()函数:移动文件的读写位置
http://c.biancheng.net/cpp/html/236.html

lseek函数的用法
http://blog.csdn.net/songyang516/article/details/6779950

C语言read()函数:读文件函数(由已打开的文件读取数据)
http://c.biancheng.net/cpp/html/239.html


0 0
原创粉丝点击