0

c++ を使用して Linux inode ビットマップをフェッチします。このコードを使用して、最初にスーパー ブロックを取得しました。

    #include <cstdlib>
    #include <linux/ext2_fs.h>
    #include <linux/fs.h>
    #include <iostream>
    #include <stdio.h>
    #include <fstream>
    #include <fcntl.h>
    #include <linux/fs.h>

    using namespace std;

    /*
     * 
     */

    int main() {
        int fd;
        char boot[1024];
        struct ext2_super_block super_block;

        fd = open("/dev/sda1", O_RDONLY);
    /* Reads the boot section and the superblock */
    read(fd, boot, 1024);
    read(fd, &super_block, sizeof (struct ext2_super_block));

    /* Prints the Magic Number */
    printf("%x\n", super_block.s_magic);

    close(fd);

    return 0;
}

しかし、実行するたびにエラーが発生します:

In file included from main.cpp:2:0:
/usr/include/linux/ext2_fs.h:181:18: error: ‘S_ISDIR’ was not declared in this scope
/usr/include/linux/ext2_fs.h:183:23: error: ‘S_ISREG’ was not declared in this scope

これに関する良い例やチュートリアルが見つかりませんでした。誰か助けてくれませんか?

EDIT:
私は含めまし<linux/stat.h>たが、それでも同じエラーが発生します。

4

2 に答える 2

3
#grep -rw S_ISREG /usr/src/linux/include
/usr/src/linux/include/linux/fs.h:  if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
/usr/src/linux/include/linux/fs.h.~1~:  if (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
/usr/src/linux/include/linux/stat.h:#define S_ISREG(m)  (((m) & S_IFMT) == S_IFREG)

したがって、カーネル ソース ツリーで stat.h を見つけてインクルードする必要があります。

于 2012-12-20T17:10:37.623 に答える
2

Linuxのソースコード「stat.h」は、Cライブラリに付属しているファイルと同じではありません。彼らはたまたま同じ名前を持っています。正しいstat.hを見つけるには、インクルードパスを設定する必要があります(実行しようとしていることによっては、両方が必要になる場合があります)。

于 2012-12-20T17:19:57.223 に答える