文件管理相关系统编程(2)

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
    int fd = open("fcnt", O_RDWR | O_APPEND|O_SYNC );
    printf("文件描述符=%d\n", fd);
    int flag = fcntl(fd, F_GETFL, 0);
    switch (flag & O_ACCMODE) {
    case O_RDWR:
        printf("O_RDWR\n");
        break;
    case O_RDONLY:
        printf("O_RDONLY\n");
        break;
    case O_WRONLY:
        printf("O_WRONLY\n");
        break;
    default:
        printf("default\n");
        break;
    }
    if (flag & O_APPEND) {
        printf("O_APPEND\n");
    }
#if defined (O_SYNC)
    if (flag & O_SYNC) {
        printf("O_SYNC\n");
    }
#endif
    if (flag & O_NONBLOCK) {
        printf("O_NONBLOCK\n");
    }
    close(1);
    fcntl(fd,F_DUPFD,1);
    puts("通过标准输出写到文件\n");
    return 0;
}

控制台输出

文件描述符=3

O_RDWR

O_APPEND

O_SYNC

sync|fsync|fdatasync

当数据写入文件时,内核通常先将数据复制到一个缓冲区中,如果该缓冲区尚未写满,则不将其排入输出队里,直到其写满或者内核需要使用这块缓冲区做其他使用,这种方式叫做延迟写

好处是,可以减少IO操作,但是带来的风险就是系统发生故障时,会造成数据的丢失

总结起来,数据写入文件分为以下3步:

1.写入缓冲区

2.缓冲区数据排入输出队里

3.将缓冲区数据写入磁盘

void sync (void)

将缓冲区排入输出队里后返回

int fsync (int __fd);

等待数据写入磁盘并且文件属性更新后返回

int fdatasync (int __fildes);

等待数据写入磁盘返回

access
测试实际用户是否有相应权限

int access (constchar *name, int mode)

mode:

R_OK:测试读权限

W_OK:测试写权限

X_OK:测试执行权限

F_OK:测试文件是否存在

文件链接

文件链接分为2种情况

1.硬链接:不会产生新的INODE,IBLOCK,只是在原有数据连接数上+1

不能跨文件系统使用

硬链接目录需要ROOT权限

2.软链接:产生的INODE,IBLOCK,新的IBLOCK记录链接的内容

可以跨文件系统使用

对于软链接来说,有些函数时直接作用链接文件本身,有些函数则跟随源文件链接到源文件

函数

 

不跟随符号链接

 

跟随符号链接

 

access

     

 

chdir

     

 

chmod

     

 

chown

 

 

 

creat

     

 

exec

     

 

lchown

 

     

link

     

 

lstat

 

     

open

     

 

opendir

     

 

pathconf

     

 

readlink

 

     

remove

 

     

rename

 

     

stat

     

 

truncate

     

 

unlink

 

     

link|unlink
创建文件的硬链接

int link (constchar *__from, constchar *__to)

删除一个文件

int unlink (constchar *__name)

说明:对于硬链接来说unlink只是删除文件链接符,文件实际数据的连接数-1,如果为文件实际数据0则在所有进程关闭对此文件连接时删除

举例

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/19069.html