zoukankan      html  css  js  c++  java
  • 文件编程之Linux下系统调用

    说明:
    linux下文件编程可使用两种方法:
    ****linux系统调用
    ****C语言库函数

    前者依赖于linux系统,后者与操作系统是独立的。
    在任何操作系统下,使用C语言库函数操作文件的方法都是相同的。

    这里首先记录下Linux下系统调用操作文件编程的学习过程。
    函数原型:
    1、系统调用--创建:
    int create(const char *filename, mode_t mode);

    filename为要创建的文件名(包含路径,缺省为当前路径);
    mode为创建模式。

    模式可用数字来表示:
    可执行为1;
    可写为2;
    可读为4;
    上述和,如可写可读为6,对应文件权限。


    文件描述符:在linux系统中,所有打开的文件都对应一个文件描述符。

    2、系统调用--打开:
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);

    pathname为要打开的文件名(包含路径,缺省为当前路径)
    flags为打开标志,常见的打开标志:
    O_RDONLY 只读
    O_WRONLY 只写
    O_RDWR 读写
    O_APPEND 追加方式
    O_CREAT 创建一个文件
    O_NOBLOCK 非阻塞方式

    如果使用了O_CREAT标志,则使用带mode的open函数,这时要指定文件权限。

    3、系统调用--关闭
    int close(int fd);

    fd为打开的文件描述符。

    4、系统调用--读
    int read(int fd, const void *buf, size_t length);

    功能:从fd所指定的文件中读取length个字节到buf所指向的缓冲区中,
    返回值为实际读取的字节数。

    5、系统调用--写
    int write(int fd, const void *buf, size_t length);

    功能:把length个字节从buf指向的缓冲区中写到fd所指向的文件中,
    返回实际写入的字节数。

    6、系统调用--定位
    int lseek(int fd, offset_t offset, int whence);

    功能:将文件读写指针相对whence移动offset个字节。
    操作成功,返回文件指针相对于文件头的位置。

    whence可用下数值:
    SEEK_SET 相对文件开头
    SEEK_CUR 相对文件读写指针的当前位置
    SEEK_END 相对文件末尾

    offset可取负值,表示向前移动。

    计算文件长度时,可用 lseek(fd, 0, SEEK_END);

    7、系统调用--访问判断
    int access(const char *pathname, int mode);

    功能:判断文件是否可以进行某种操作。

    mode可取R_OK可读、W_OK可写、X_OK可执行、F_OK文件存在。

    返回值:测试成功时,返回0,否则返回-1。

    代码实例如下:

     1 ****************************************
     2     功能:实现文件的复制工作;
     3           练习文件操作的系统调用函数的使用
     4                     如:open、close、read、write、lseek
     5         编译:gcc linux_file_cp.c
     6         执行:./a.out src_file dst_file
     7         说明:src_file为保存有原来内容的文件
     8               dst_file为要创建的文件。
     9     日期:2015.9.22
    10 *****************************************/
    11 
    12 #include <stdio.h>
    13 #include <stdlib.h>
    14 #include <unistd.h>
    15 #include <sys/types.h>
    16 #include <sys/stat.h>
    17 #include <fcntl.h>
    18 
    19 #define BUFFER_SIZE 1024 
    20 
    21 int main(int argc,char **argv) 
    22 { 
    23     int from_fd;
    24     int to_fd; 
    25     long file_len=0;
    26     char buffer[BUFFER_SIZE]; 
    27     char *ptr; 
    28     
    29     /*判断入参*/
    30     if(argc!=3) 
    31     { 
    32         printf("Usage:%s fromfile tofile
    ",argv[0]); 
    33         exit(1); 
    34     } 
    35 
    36 /* 打开源文件 */ 
    37 if((from_fd=open(argv[1], O_RDONLY)) == -1) 
    38 { 
    39     printf("Open %s Error
    ",argv[1]); 
    40     exit(1); 
    41 } 
    42 
    43 /* 创建目的文件 */
    44 /*如果目的文件不存在,则创建*/ 
    45 if((to_fd=open(argv[2], O_RDWR | O_CREAT, 0666)) == -1) 
    46 { 
    47     printf("Open %s Error
    ",argv[2]); 
    48     exit(1); 
    49 } 
    50 
    51 /*测得文件大小*/
    52 file_len = lseek(from_fd, 0L, SEEK_END);
    53 lseek(from_fd, 0L, SEEK_SET);
    54 printf("from file size is= %d
    ",file_len);
    55 
    56 /*进行文件拷贝*/
    57 while((read(from_fd, buffer, BUFFER_SIZE)) != 0)
    58 { 
    59     write(to_fd, buffer, file_len);
    60 } 
    61 close(from_fd); 
    62 close(to_fd); 
    63 exit(0); 
    64 } 
  • 相关阅读:
    WebAPI搭建(一)如何在Webforms 下 搭建WebAPI
    解决VS2010在新建实体数据模型出现“在 .NET Framework Data Provider for Microsoft SQL Server Compact 3.5 中发生错误。请与提供程序供应商联系以解决此问题。”的问题
    ASP.NET 解决在点击Button执行服务器事件之前验证用户输入并阻塞
    python中强大的list
    除法运算和四舍五入
    python的基本数学运算
    配置python环境
    唠叨一些关于Python的事情
    人生苦短,我用python
    ASP.NET MVC4实现TinyMCE 4.0.20自定义上传功能
  • 原文地址:https://www.cnblogs.com/paladinzxl/p/4829008.html
Copyright © 2011-2022 走看看