[转帖]Unix环境编程-文件和目录一_VMware, Unix及操作系统讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  VMware, Unix及操作系统讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3302 | 回复: 0   主题: [转帖]Unix环境编程-文件和目录一        下一篇 
ulee@land
注册用户
等级:上尉
经验:769
发帖:55
精华:1
注册:2012-12-17
状态:离线
发送短消息息给ulee@land 加好友    发送短消息息给ulee@land 发消息
发表于: IP:您无权察看 2012-12-24 14:30:41 | [全部帖] [楼主帖] 楼主

Unix环境编程-文件和目录-——文件

一、打开/关闭文件

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 打开成功,返回文件描述符。

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

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

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

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

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

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

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

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

下面是一个例子

#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’之前的字节数,也就是是原文件的字节数而不是你想读的字节数。

5.

名称:

write


目标:

将内存中的数据写入文件。

头文件:

#include < unistd.h>


函数原形:

size_t write(int fd, const void *buf, size_t count)


参数:

fd 文件描述符

buf 内存数据

count 要写的字节数

返回值:

-1 遇到错误

Num written 成功写入,返回写入的字节数目。

在实际的写入过程中,可能会出现写入的字节数少于所要求的。这可能有两个原因,第一是有的系统对文件的最大尺寸有限制,第二是磁盘空间接近满了。在上述两种情况下内核都会尽力把数据往文件中写,并将实际写入的字节数返回,所以调用write后都必须检查返回值是否与要写入的相同,如果不同就要采取相应的措施。

学完上面几个系统调用,我们就可以自己编写的cp命令了。它的基本思路是从原文件读取数据写入缓冲,再将缓冲的数据写入目标文件。

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#define BUFFERSIZE 4096
#define COPYMODE 0644
void oops(char *s1,char *s2);
main(int argc,char *argv[])
{
      int in_fd,out_fd,n_chars;
      char buf[BUFFERSIZE];
      if(argc!=3)
      {
            fprintf(stderr,”usage:%s source destination\n”,*argv);
            exit(1);
      }
      if((in_fd=open(argv[1],O_RDONLY))==-1)
      oops(“Cannot open”,argv[1]);
      if((out_fd=creat(argv[2], COPYMODE))==-1)
      oops(“Cannot creat”,argv[2]);
      while((n_chars=read(in_fd,buf,BUFFERSIZE))>0)
      {
            if(write(out_fd,buf,n_chars)!=n_chars)
            oops(“Write error to”,argv[2]);
      }
      if(n_chars==-1)
      opps(“Read error form”,argv[1]);
      if(close(in_fd)==-1||close(out_fd)==-1)
      oops(“Error clising files”);
}
void oops(char *s1,char *s2)
{
      fprintf(stderr,”Error:%s”,s1);
      perror(s2);
      exit(1);
}




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论