依睛(IT blog) 我回来了,PHP<-->C/C++ LINUX

笨鸟

统计

积分与排名

友情连接

最新评论

UNIX环境高级编程读书笔记(一)—文件IO (1)

一、打开 / 关闭文件

1

名称:

open

目标:

打开一个文件。

头文件:

#include <sys/types.h>

#include <sys/stat.h>

#include < fcntl.h>

函数原形:

int open(const char * pathname,int flags);

int open(const char * pathname,int flags,mode_t mode);

参数 :

pathname    文件名

    

flags          打开模式

返回值:

-1     遇到错误

    

int    打开成功,返回文件描述符。

这个系统调用在进程和文件之间建立一条连接 ,这个连接被称为文件描述符,它就像一条由进程通向内核的管道。

要打开一个文件 必须指定文件名和打开模式 种打开模式 只读 只写 可读可写 分别对应于 O_RDONLY,O_WRONLY,O_RDWR, 这在头文件 /usr/include/fcntl.h 中有定义。

       打开文件是内核提供的服务,如果在打开过程中内核检测到任何错误,这个系统调用就会返回 -1 。错误的类型是各种各样的,如:要打开的文件不存在。即使文件存在可能因为权限不够而无法打开,在 open 的联机帮助中列出了各种可能的错误,大家可以看看。

       UNIX 允许一个文件被多个进程访问,也就是说当一个文件被一个进程打开后,这个文件还可以被其它进程打开。

       如果文件被顺利打开内核会返回一个正整数的值,这个数值就叫文件描述符,文件描述符是是一个简单的整数,用以标明每一个被进程所打开的文件,描述符0代表标准输出,对应的宏是 STDOUT_FILENO, 描述符 1 代表标准输入,对应的宏为 STDIN_FILENO ,描述符 2 代表标准错误输出,对应的宏为 STDERR_FILENO, 系统给进程分配描述符都是从3开始的, 如果同时打开好几个文件,它们所对应的的文件描述符是不同的,如果一个文件打开多次,对应的文件描述符也不相同。必须通过文件描述符对文件操作。下面的程序可以证明这一点。

/*1_1.c*/

#include <stdio.h>

#include <fcntl.h>

#include <unistd.h>

 

int main(int ac,char *av[])

{

int fd;

int size;

char buf[1024];

 

if(ac==1)

    printf(“please input file!\n”);

else

{

    while(--ac)

    {

         printf(“file:%s\n”,av[ac]);

         fd=open(av[ac],O_RDONLY);

         printf(“fd,%d\n”,fd);

         size=read(fd,buf,sizeof(buf));

         printf(“fd,%d\n”,size);

         printf(“%s”,buf);

    }

}

close(fd);

}

 

我们编译一下

[root@LINUX root]# cc –o show_read show_read.c

运行

[root@LINUX root]# ./show_read show_read.c

下面是运行结果。

file: show_read.c

fd:3

size:423

#include <stdio.h>

……

 

 

我们可以看出此次打开文件的文件描述符是 3 ,如果我们执行下面的语句。

[root@LINUX root]# ./show_read show_read.c show_read.c

下面是运行结果:

file: 3

size: 423

#include <stdio.h>

……

 

file: 4

size 432

#include <stdio.h>

……

 

可以看到,我们第一次打开文件的描述符是 3 ,第二次打开文件的文件描述符是 4

 

Open 函数的第二个功能是创建一个新文件并把它打开,其中有几个宏定义对于着 flags 参数:

       O_CREAT      如果打开文件不存在 open 就创建一个文件。

       O_TRUNC   如果打开的文件已经存在 open 就把原文件清空,长度置为 0

所有我们利用 open pathname, O_WRONLY| O_CREAT| O_TRUNC,0777 ;

       下面是一个例子

/*1_2.c*/

#include <unistd.h>

#include <sys/stat.h>

#include <sys/fcntl.h>

#include <stdio.h>

 

char buf[]=”abcdefg”;

int main(int argc,char *argv[ ])

{

    int  fd;

    if((fd=open(argv[1],O_RDWR|O_CREAT|O_TRUNC,0777))==-1)

        perror (“error”);

if(write(fd,buf,7)!=7)

    perror(“error”);

if(read(fd,buf,sizeof(buf))<0)

    perror (“error”);

printf(“%s\n”,buf);:

}

 

2

名称:

close

目标:

关闭一个文件。

头文件:

#include < unistd.h>

函数原形:

int close(int fd)

参数 :

fd    文件描述符

返回值:

-1     遇到错误

    

int    关闭成功,返回文件描述符。

       Close 这个系统调用会关闭进程和文件 fd 之间的连接,如果关闭过程中出现错误 ,close 返回 -1 ,如: fd 所指的文件并不存在。关闭成功则返回文件描述符。

 

3.

名称:

creat

目标:

创建 / 重写一个文件

头文件:

#include <sys/types.h>

#include <stat.h>

#include < fcntl.h>

函数原形:

int creat(const char *pathname,mode_t mode)

参数 :

pathname   文件名

 

mode      访问模式

返回值:

-1         遇到错误

     \

fd         创建成功,返回文件描述符

       Creat 告诉内核创建一个名为 filename 的文件,如果这个文件不存在,就创建它,如果已经存在,就把它的内容清空,把文件的长度设为 0     

       如果内核成功地创建了文件 那么文件的许可位 permission bits 被设置为由第二个参数 mode 所指定的值 .

fd=creat(“addressbook”,0644);

       创建一个名为 addressbook 的文件 如果文件不存在 那么文件的许可位被设为 rw-r-r—.

如果文件已存在它的内容会被清空。任一情况下, fd 都会是指向 addressbook 的文件描述符。

 

二、文件的读取和写入

4

名称:

read

目标:

把数据读到缓冲区。

头文件:

#include < unistd.h>

函数原形:

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

参数 :

fd       文件描述符

 

buf      用来存放数据的目的缓冲区

 

count     要读取的字节数

返回值:

-1       遇到错误

    

numread  成功关闭,返回所读取的字节数目。

read 这个系统调用请求内核从 fd 所指定的文件中读取 qty 字节的数据,存放到 buf 所指定的内存空间中,内核如果成功地读取了数据,就返回所读取的字节数目。否则返回 -1

当文件的字节数没有你想要的那么多时, read 就会判断下一个数值是不是 ’\0’ ,如果是就停止读取,然后退出。 numread 返回的是 ’\0’ 之前的字节数,也就是是原文件的字节数而不是你想读的字节数。


http://blog.chinaunix.net/u/22935/showart_273038.html

posted on 2007-08-11 14:19 向左向右走 阅读(1454) 评论(0)  编辑 收藏 引用 所属分类: UNIX高级环境编程