004_文件和目录
文件IO
文件描述符:对于内核而言,所有打开的文件都由文件描述符引用。文件描述符是一个非负整数
Open函数返回的一定是最小的未用描述符数字,这句话不难理解吧。
IO效率
在使用read,write系统调用时,选取BUFSIZE等于8192时效率达到最优。
文件共享
进程表项包含了文件描述符标志和志向一个文件表项的指针。
文件表项包含了文件状态标志,当前位移量和指向文件V节点表项的指针。
V节点包含了文件类型和对此文件进行各种操作的函数的指针信息。
V节点还包含了i节点,i节点包含了文件的所有者,文件长度等等。
lseek函数值修改了文件表项中的当前文件位移量,没有进行人任何IO操作。
dup() 和
dup2()
使用这两个函数,共享了一个文件表项。
fcntl()函数
可以改变已经打开文件的性质。
Ioctl()函数
是IO操作的杂物箱,不能用本章中其他函数表示的IO操作通常都能用ioctl表示。所以功能很强大。
下面是一个简单的练习,将file1中的内容复制到file2中:
- #include "com_head.h" /*一些常用的头文件*/
- #include <stdlib.h>
-
#define BUF_SIZE 10
-
-
int main(int argc, char *argv[])
-
{
-
int fd_src, fd_dist;
-
char buf[BUF_SIZE];
-
int count;
-
int ret;
-
-
if (argc != 3)
-
{
-
fprintf(stderr, "Usage: argv[0] file1 file2\n");
-
exit(EXIT_FAILURE);
-
}
-
-
/*可读方式打开文件*/
-
if ((fd_src = open(argv[1], O_RDONLY)) == -1)
-
{
-
perror("fd_src open()");
-
exit(EXIT_FAILURE);
-
}
-
-
/*可读写,可追加的方式打开文件*/
-
if ((fd_dist = open(argv[2], O_RDWR | O_CREAT | O_APPEND, 0644)) == -1)
-
{
-
perror("fd_dist open()");
-
close(fd_src);
-
exit(EXIT_FAILURE);
-
}
-
-
/*把fd_src所代表的文件中内容写到fd_dist所代表的文件中去*/
-
while ((count = read(fd_src, buf, BUF_SIZE)) > 0)
-
{
-
ret = write(fd_dist, buf, count);
-
if (ret != count)
-
{
-
printf("read error!\n");
- close(fd_src);
- close(fd_dist);
-
exit(EXIT_FAILURE);
-
}
-
}
- close(fd_src);
- close(fd_dist);
-
exit(EXIT_SUCCESS);
-
}
水平有限,如果有错误的地方,请指正,thanks
cjok.liao@gmail.com
阅读(1653) | 评论(0) | 转发(0) |