ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-Unix文件描述符

2019-11-20 09:51:14  阅读:224  来源: 互联网

标签:unix c-3 linux c-4


今天,我发现Linux中文件描述符的行为非常有趣.看一下代码:

#include <dirent.h>     /* Defines DT_* constants */
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <errno.h>


#define handle_error(msg) \
do { trace(msg); exit(0); } while (0)
#define trace printf

int createFile(const char* name) {
    int r;
    r = ::open( name, 0 );
    if (r < 0)
    {
        trace("create file : %s\n", name);
        r = ::open( name, O_CREAT, 0666 );
        if (r < 0)
            trace("error r < 0 %d\n",errno);
    }
    return r;
}

int createDir(const char* name) {
    int r = ::mkdir( name, 0777 );
    if (r != 0) {
        trace("error r!=0\n");
    }
    r = open(name, 0);
    if (r < 0) {
        trace("error create dir r <0\n");
    }
    return r;
}

struct linux_dirent {
    long           d_ino;
    off_t          d_off;
    unsigned short d_reclen;
    char           d_name[];
};

#include <sys/types.h>
#include <dirent.h>
void test123(int fd) {
    int nread;
    char buf[1024];
    unsigned char buffer[1024];
    struct linux_dirent *d;
    int bpos,r;
    char d_type;


    if (fd == -1)
        handle_error("open");

    for ( ; ; ) {
        nread = syscall(SYS_getdents, fd, buf, 1024);
        if (nread == -1)
            handle_error("getdents");

        if (nread == 0)
            break;

        trace("--------------- nread=%d ---------------\n", nread);
        trace("i-node#  file type  d_reclen  d_off   d_name\n");
        for (bpos = 0; bpos < nread;) {
            d = (struct linux_dirent *) (buf + bpos);
            trace("%8ld  ", d->d_ino);
            d_type = *(buf + bpos + d->d_reclen - 1);
            trace("%4d %10lld  %s\n", d->d_reclen,
                  (long long) d->d_off, d->d_name);
            bpos += d->d_reclen;
        }
    }
}


int main(int argc, const char * argv[]) {



    int dir = createDir("test");

    int file = createFile("test/file.gg");

    test123(dir);
    close(dir);
    close(file);


    return 0;
}

在该代码中,我创建文件夹,保存其文件描述符,在该文件夹中创建文件,然后我想通过文件描述符打印该目录中的所有文件.但是我得到以下输出:

create file : test/file.gg
--------------- nread=32 ---------------
i-node#  file type  d_reclen  d_off   d_name
   48879    16          1  .
   48880    16          2  ..

该文件夹中没有file.gg文件.因此,我的问题是-它可以如何工作以及如何与文件描述符一起正确工作?据我了解,文件描述符只是进程表中所有已打开文件和目录的本地索引.但是看起来文件夹描述符以某种方式将文件缓存在该文件夹中.
在我的情况下如何正确使用描述符?

解决方法:

尝试在目录上执行fsync.您应该使用O_RDONLY标志打开目录. O_WRONLY将失败.创建一个文件,同步可能不会同步该文件的元数据. this article中的更多信息

标签:unix,c-3,linux,c-4
来源: https://codeday.me/bug/20191120/2043098.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有