Chinaunix首页 | 论坛 | 博客
  • 博客访问: 886697
  • 博文数量: 380
  • 博客积分: 3495
  • 博客等级: 中校
  • 技术积分: 3996
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 09:35
文章分类

全部博文(380)

文章存档

2015年(2)

2014年(5)

2013年(9)

2012年(9)

2011年(67)

2010年(103)

2009年(182)

2008年(3)

我的朋友

分类: LINUX

2009-03-17 08:52:23

Linux的文件操作是以几个系统调用来实现的,下面就分别介绍一下吧。
首先是文件操作的公共部分:
File Descriptor 也就FDS,换成中文通常也有叫文件句柄的。其实在内核、实现时就是一个0开始的整数,
因为-1被用来表示错误。当然了,这个FDS里还有一些别的东西,如metadata,uid,gid等。
提到了uid,这个当然就是当前进程对应的有效UID了,GID嘛,也是当前进程对应的有效GID,不过有时指定了文件所有目录的SGID,那么下边所有的文件在处理进所用的GID就是父目录的GID。
接下来就是创建文件,这个通常是用
creat或open系统调用来完成的。下面是系统调用原型
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);
其中pathname是文件所在的路径,flags主要指明是读,写,追加,创建等文件操作,这个是可以用|符号来一并指定的。
接下来是mode,它会在创建时指定用户,组,其它人的权限。

随后对应的文件操作当然是read了。
不过要注意的是read本身是会被中断的。
read的函数原型如下:
#include
ssize_t read(int fd, void *buf, ssize_t len);

要是想读取一个文件的所有内容,那么用如下的代码。

ssize_t ret;
while(len != 0; && (ret = read(fd, buf,len)) != 0)
{
if(ret == -1)
{
if(errno == EINTR)
continue;
perror("read");
break;
}
len -= ret;
buf += ret;
}
另外LINUX对所读的最大长度是有限制的,SIZE_MAX通常是7fffffff
写入也是一样的,
ssize_t write(int fd, void *buf, size_t count);
写的时候是从文件的当前位置开始的。
这取决于当时调用open函数的参数,有时是文件开头,有时是文件结尾,
要是用seek,还可能是文件的某一中间位置。

阅读(367) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~