百度首页 | 百度空间
 
查看文章
 
《The C Programing Language》读书笔记——基本语法11
2008-05-15 16:29

第八章 Unix系统接口

Unix内核的三个基本职能是进程控制、文件系统管理和外围设备操作,用户可以通过系统调用(system call)和库函数访问这些内核操作,它们实际上是操作系统中可能被用户程序调用的一些由C语言实现的函数,很多库函数通过调用系统调用间接为用户提供服务,使用户不必了解低层次的内核操作细节。

文件描述符(file descriptor

当用户程序获得权限打开文件时,操作系统会向程序返回一个小的非负整数,称作文件描述符,今后对文件的读写通过文件描述符而不是文件名来实现(类似于标准库中的文件指针)。被打开文件的所有信息由操作系统维护,而用户程序仅通过文件描述符引用文件。

当命令解释程序(shell)运行一个程序,系统将自动为其打开stdinstoutstderr三个文件,文件描述符分别为012
当用户对程序的输入,输出和错误输出重定向时,
shell
将改变文件描述符012的定义。使用管道时亦然。
无论何种情况,文件描述符的赋值都由
shell
完成,程序本身不知道输入和输出来自哪儿,只知道从文件描述符0输入,使用12输出。

底层I/O

系统调用readwrite用于输入和输出:
int read(int fd, char *buf, int n)
int write(int fd, char *buf, int n)
fd
是文件描述符,buf是程序存取数据的缓冲区,n是要传输的字节数,返回值为当前传输字节数,返回0表示文件结束,返回-1表示出错。

main()
{
char buf[BUFSIZE];
int n;
while((n=read(0, buf, BUFSIZE) > 0)
write(1, but, n);
return 0;
}

程序从文件描述符0读取输入,复制到文件描述符1read每次欲读取BUFSIZE个字节,当读至文件末尾时,可能返回少于BUFSIZE个字节,最后读完时read将返回0,循环结束。
可以利用
read
write函数构造getcharputchar函数。

文件操作

Unix系统调用提供了文件打开,创建和关闭的函数:

int open(char *name, int flags, int perms)
open
返回被打开文件的文件描述符,flags是打开方式(O_RDONLYO_WRONLYO_RDWR),对于open函数,perms总为0。当成功打开文件时,open返回文件描述符,若出错返回-1

int creat(char *name, int perms)
创建一个新文件,若成功则返回文件描述符,否则返回-1creat也可以覆盖已有文件,原文件内容将被丢弃。permsUnix文件系统中的9位文件权限。

close(int fd)
断开文件描述符和打开文件之间的连接,释放文件描述符。它与C语言标准库中的fclose类似,只是少了输出缓冲区机制。通过exit退出程序或从main函数返回将自动关闭所有程序打开的文件。

unlink(char *name)
从系统中删除文件名,与C语言标准库中的remove类似。

随机存取(random access
long lseek(int fd, long offset, int origin)
在文件描述符为fd的文件中定位偏移量为offset的位置。origin0offset从文件起始处算起,为1时从当前位置算起,为2时从文件结尾处算起。函数返回值为long类型,之后的文件读写将从该位置开始。出错时返回-1
C语言标准库函数fseeklseek相似,只是使用FILE *fp作为第一个参数,出错时返回非0


类别:c/c++ | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu