系统调用方式访问文件系统调用依赖于操作系统

  1. int creat(const char *filename, mode_t mode)

  2. mode:创建模式(指定文件的属性)可以直接用数字表示文件的访问权限
  3. filename:要创建的文件名(包含路径,缺省为当前路径)

例子:

  1. #include <stdio.h>
    #include
    <stdlib.h>
    #include
    <sys/types.h>
    #include
    <sys/stat.h>
    #include
    <fcntl.h>
    void create_file(char *filename)
    {
    if(creat(filename, 0755) < 0){
    printf(
    "creat file %s failure!\n", filename);
    return -1;
    }
    else {
    printf(
    "creat file %s success!\n", filename);
    }
    }

    int main(int argc, char *argv[])
    {
    int i;
    if(argc < 2) {
    perror(
    "argument error!\n");
    return -1;
    }
    for(i = 1;i < argc; i++) {
    create_file(argv[i]);
    }
    return 0;
    }

文件描述在linux系统中,所有打开的文件都对应一个文件描述符。文件描述符的本质是一个非负整数。当打开一个文件时,由系统分配。文件描述符的范围是0-OPEN_MAX。

  1. int open(const char *pathname, int flags)
    int open(const char *pathname, int flags, mode_t mode)
  2. pathname:要打开的文件名
    flags:打开标志
  3. O_RDONLY 只读方式打开
  4. O_WRONLY 只写方式打开
  5. O_RDWR 读写方式打开
  6. O_APPEND 追加方式打开
  7. O_CREATE 创建一个文件
  8. O_NOBLOCK 非组塞方式打开当使用
  9. O_CREATE标志时,则使用第二个函数,即三个参数的。需要使用mode来指定文件的访问权限。

例子

  1. #include <stdio.h>
    #include
    <stdlib.h>
    #include
    <sys/types.h>
    #include
    <sys/stat.h>
    #include
    <fcntl.h>
    int main(int argc, char *argc[])
    {
    int fd;
    if(argc < 2) {
    puts(
    "please enter filename:");
    return -1;
    }
    if(fd = open(argv[1], O_CREATE|O_RDWR, 0775) < 0) {
    perror(
    "open file error!\n");
    return -1;
    }
    else {
    printf(
    "open file %d success!\n", fd);
    }
    close(fd);
    return 0;
    }

  1. 文件关闭
  2. int close(int fd)

  3. fd:文件描述符(打开文件时,由系统分配)

  1. int read(int fd, const void *buf, size_t length)
  2. 从文件描述符fd所指向的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取的字节数。

  1. int write(int fd, const void *buf, size_t length)
  2. length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件中,返回值为实际写入的字节数。

  1. int lseek(int fd, offset_t offset, int whence)
  2. 将文件读写指针相对whence移动offset个字节。操作成功时,返回文件指针相对于文件头的位置。
    (可以利用lseek计算文件长度lseek(fd, 0, SEEK_END))
    whence可用以下值描述:
      SEEK_SET:相对文件开头
      SEEK_CUR:相对文件读写指针的当前位置
      SEEK_END:相对文件末尾offset可取负值,表示向前移动。

 

 

  1. int access(const char *pathname, int mode)
  2. pathname:文件名称mode:要判断的访问权限,可以取以下值或他们的组合。
      F_OK:文件存在
  3.   X_OK:文件可执行
  4.   W_OK:文件可写
  5.   R_OK:文件可读
    返回值:当测试成功时,函数返回0, 否则如果一个条件不符,返回-1

例子:

  1. #include <unistd.h>
    int main(void)
    {
    if(access("/etc/passwd",R_OK) == 0)
    printf(
    "/etc/passwd can be read!\n");
    return 0;
    }

综合实例:


  1. #include <stdio.h>
  2. #include <sys/stat.h>
    #include
    <errno.h>
    #include
    <fcntl.h>

    #define BUFFER_SIZE 1024

    int main(int argc, char *argv[])
    {
    int from_fd, to_fd;
    int bytes_read, bytes_write;
    char buffer[BUFFER_SIZE];
    char *ptr;

    if(argc != 3) {
    fprintf(stderr,
    "Usage: %s fromefile tofile\n\a", argv[0]);
    return -1;
    }

    if((from_fd = open(argv[1], O_RDONLY)) == -1){
    fprintf(stderr,
    "Open %s Error:%s\n", argv[1], strerror(errno));
    return -1;
    }

    if((to_fd = open(argv[2], O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)) == -1){
    fprintf(stderr,
    "Open %s Error:%s\n",argv[2], strerror(errno));
    return -1;
    }

    while(bytes_read = read(from_fd, buffer, BUFFER_SIZE)){
    if((bytes_read == -1)&&(errno != EINTR))
    break;
    else if(bytes_read > 0) {
    ptr
    = buffer;
    while(bytes_write == write(to_fd, ptr, bytes_read)) {
    if((bytes_write == -1) && (errno != EINTR))
    break;
    else if(bytes_write == bytes_read)
    break;
    else if(bytes_write > 0) {
    ptr
    +=bytes_write;
    bytes_read
    -= bytes_write;
    }
    }
    }
    }
    close(from_fd);
    close(to_fd);
    return 0
    ;
  3.  }


版权声明:本文为moupeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/moupeng/archive/2011/04/14/2015781.html