系统调用方式文件编程

     对于内核而言,所有打开的文件通过文件描述符引用。文件描述符是一个非负整数。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。当读或写一个文件时,使用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
2.1 打开文件
 
2.1.1 函数名       open 
2.1.2 函数原形    int open(const char *pathname,int flags);  int open(const char *pathname,int flags, mode_t mode);
2.1.3 函数功能      打开或者创建一个文件    
2.1.4 所属头文件     <sys/types.h> <sys/stat.h>  <fctl.h>
2.1.5 返回值          成功:文件描述符   失败:-1
2.1.6 参数说明        pathname:要打开的文件名(含路径)
                     flags:文件打开的标志
                         O_RDONLY:只读
                         O_WRONLY:只写
                         O_RDWR:可读、可写
以上三个常量是必须包含其一的,下面的这两个是可选择的:
                         O_APPEND:以追加方式打开文件
                         O_CREAT:当打开的文件不存在的时候,创建该文件
                     mode:一定是flags中使用了O_CREAT标志,mode记录不同用户对创建的文件的权限。
 
 

2.2 创建文件     

2.1.1 函数名        creat
2.1.2 函数原形      int creat(const char* pathname, mode_t mode);   
2.1.3 函数功能      创建一个文件  
2.1.4 所属头文件     <sys/types.h> <sys/stat.h>  <fctl.h>
2.1.5 返回值         成功:文件描述符   失败:-1
2.1.6 参数说明       pathname:要打开的文件名(含路径)
                     mode:创建的文件的读写权限
 

2.3 关闭文件

2.3.1 函数名          close
2.3.2 函数原形        int close(int fd);
2.3.3 函数功能        关闭一个文件
2.3.4 所属头文件       <unistd.h>
2.3.5 返回值           成功:0   失败:-1
2.3.6 参数说明          fd:待关闭的文件描述符
 
 

2.4 读文件

2.4.1 函数名            read
2.4.2 函数原形          ssize_t read(int fd, void *buf, size_t count);
2.4.3 函数功能          从一个打开的文件中读取数据
2.4.4 所属头文件         <unistd.h>
2.4.5 返回值             成功:返回读取的字节数  失败:-1
2.4.6 参数说明           fd:待读取的文件的文件描述符
                         buf:读取来的数据存放在buf里。
                         count:想要读取的字节数
 

2.5 写文件

2.5.1 函数名             write
2.5.2 函数原形           ssize_t write(int fd, const void *buf, size_t count);
2.5.3 函数功能           向一个打开的文件中写入数据
2.5.4 所属头文件         <unistd.h>
2.5.5 返回值             成功:写入到文件里的字节数  失败:-1
2.5.6 参数说明           fd:要写入数据的文件的文件描述符
                         buf:要写入的数据的存放位置
                         count:要写入的数据的字节数
 
 
 

2.6 定位文件

2.6.1 函数名           lseek   
2.6.2 函数原形         off_t lseek(int fd, off_t offset, int whence);
2.6.3 函数功能         重新定位文件的读写位置
2.6.4 所属头文件       <sys/types.h> <unistd.h>
2.6.5 返回值           成功:返回移动后的文件距离头文件的位置  失败:-1
2.6.6 参数说明         fd:要定位的文件的文件描述符
                       offset:偏移量
                       whence:SEEK_SET:将该文件的偏移量设置为距文件开始处的offset个字节
                            SEEK_CUR:将该文件的偏移量设置为距当前值加offset,offset可正可负。
                               SEEK_END:将该文件的偏移量设置为文件长度加offset个字节,offset可正可负。
 

2.7 复制文件描述符

2.7.1 函数名           dup
2.7.2 函数原形         int dup(int oldfd);   int dup2(int oldfd, int newfd);  
2.7.3 函数功能         复制一个文件描述符
2.7.4 所属头文件       <unistd.h>
2.7.5 返回值           成功:返回新的文件描述符  失败:-1
2.7.6 参数说明         oldfd:待复制的老的文件描述符
                      newfd:dup2则可以用newfd参数指定新描述的数值。如果newfd已经打开,则先将其关闭。如若oldfd等于newfd,则dup2返回newfd,而不关闭它。
 
小实验:创建一个aim.c文件,且将hello.c中的前10个字节复制到aim.c中
附录:
#include<stdio.h>
#include<sys/types.h> 
#include<sys/stat.h>  
#include <fcntl.h>
#include<unistd.h>
int main()
{
     int fd1 = 0;
     int fd2 = 0;
     int read_flag = 0;
     int write_flag = 0;
     char read_buf[10];

     fd1 = open("/home/copy_commander/hello.c",O_RDWR); 
     fd2 = open("/home/copy_commander/aim.c",O_RDWR|O_CREAT,S_IRWXU); 
     if(fd1 >= 0)
     {
          read_flag = read(fd1, read_buf, 10);
          if(read_flag >= 0)
          {
               write_flag = write(fd2, read_buf, 10);
               if(write_flag >= 0)
               {
                    printf("please check the file!\n");
               }
               else
                    printf("write error!\n");
          }
          else
          {
               printf("read error!\n");
          }
     }
     else
     {
          printf("open error!\n");
     }
     close(fd1);
     close(fd2);
     return 0;
}
posted @ 2015-03-04 18:22  活出自我  阅读(120)  评论(0)    收藏  举报