linux的源代码中一些文件名是啥意思?比如i、sb

red-fly 2010-07-29 08:53:22
在linux的源代码中,常常有一些文件名有着固定的后辍,比如ext2_fs_i.h、ext2_fs_sb.h、adfs_fs_i.h、adfs_fs_sb.h等等,
它们后面的“i”、“sb”是什么意思?

我是linux新手,有请大家指点一二
...全文
281 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
red-fly 2010-08-03
  • 打赏
  • 举报
回复
没人能说明一下对static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT]的附值的语法是什么意思的吗?
red-fly 2010-07-31
  • 打赏
  • 举报
回复
正是啊,我就是扣了两三天也还是编译不过,即使是编译通过,也有很多需要修改的,因为里面的很多东西都被屏蔽掉了,实际上很难正常工作,要想让它正常工作,就得有大量的修改,这工作也是很麻烦的
renjianxin520 2010-07-30
  • 打赏
  • 举报
回复
学习学习!
Coder_Granger 2010-07-30
  • 打赏
  • 举报
回复
ext2读写磁盘的代码依赖内核的其它部分,千丝万缕,全抠出来很费时间.
red-fly 2010-07-30
  • 打赏
  • 举报
回复
struct file_operations ext2_dir_operations 的附值,我大概明白是怎么回事了,不过还是要验证一下,就是逐一成员进行附值

另外,
to mymtom:
对static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT]的附值,vs不支持C99,那它是什么意思?如何修改?

注:
我只所以使用vs编译,是我想从里面把ext2的磁盘读写代码拿出来用。我就是把include和ext2里的代码拿出来放到我的工程里进行编译,修改了其它的,现在主要是这些摸不着头脑,所以无从下手
mymtom 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jszj 的回复:]

还有一些结构的附值语法,很奇怪,比如


#define S_IFLNK 0120000
...
static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT] = {
[S_IFREG >> S_SHIFT] EXT2_FT_REG_FILE,
[S_IFDIR >> S_SHIFT] EXT2_FT_DIR,
[S_IFC……
[/Quote]
这是C99的数组和结构体初始化语法,VS不支持C99,GCC支持C99!
jiaguang3010717 2010-07-29
  • 打赏
  • 举报
回复
学习学习
一老六一 2010-07-29
  • 打赏
  • 举报
回复
受教了。。。
brookmill 2010-07-29
  • 打赏
  • 举报
回复
我在8楼和9楼提到的两个简单的例子, 我用gcc都可以编译通过,用VS2005就都不行。
可能这种语法是gcc特有的吧。
楼主既然看的是内核代码,就应该用gcc编译,何必要用vc。

如果一定想在vc编译,那大概就只好改成这样:
static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT];
ext2_type_by_mode[S_IFREG >> S_SHIFT] = EXT2_FT_REG_FILE;
struct file_operations ext2_dir_operations;
ext2_dir_operations.read = generic_read_dir;
brookmill 2010-07-29
  • 打赏
  • 举报
回复
struct file_operations ext2_dir_operations = {
read: generic_read_dir,
readdir: ext2_readdir,
ioctl: ext2_ioctl,
fsync: ext2_sync_file,
};

楼主可以看看include/linux/fs.h里面file_operations的定义.
这个结构体有很多成员, read readdir ioctl fsync是其中几个, 都是函数指针.
这里是给这4个函数指针赋值. 从语法上来说, 相当于
struct S
{
int a;
int b;
int c;
int x;
int y;
int z;
};
struct S s = {
b: 1,
y: 5,
};
Wind_Runner 2010-07-29
  • 打赏
  • 举报
回复
学习学习
red-fly 2010-07-29
  • 打赏
  • 举报
回复
brookmill 2010-07-29
  • 打赏
  • 举报
回复
7楼这种写法以前没见过,好像是定义了一个数组,然后给其中几个指定的元素赋值。
我刚试了一下:
int a[5] = {
[2] 22, // 或者 [2] = 22,
[4] 44, // 或者 [4] = 44,
};
int i;
for (i=0; i<5; i++)
printf("%d\n", a[i]);
输出
0
0
22
0
44
Coder_Granger 2010-07-29
  • 打赏
  • 举报
回复
i = inode
sb = superblock
red-fly 2010-07-29
  • 打赏
  • 举报
回复
还有一些结构的附值语法,很奇怪,比如


#define S_IFLNK 0120000
...
static unsigned char ext2_type_by_mode[S_IFMT >> S_SHIFT] = {
[S_IFREG >> S_SHIFT] EXT2_FT_REG_FILE,
[S_IFDIR >> S_SHIFT] EXT2_FT_DIR,
[S_IFCHR >> S_SHIFT] EXT2_FT_CHRDEV,
[S_IFBLK >> S_SHIFT] EXT2_FT_BLKDEV,
[S_IFIFO >> S_SHIFT] EXT2_FT_FIFO,
[S_IFSOCK >> S_SHIFT] EXT2_FT_SOCK,
[S_IFLNK >> S_SHIFT] EXT2_FT_SYMLINK,
};

在vc下无法编译通过:
error C2143: syntax error : missing '}' before '['
指的是第一行“[S_IFREG >> S_SHIFT] EXT2_FT_REG_FILE,”

还有,
struct file_operations ext2_dir_operations = {
read: generic_read_dir,
readdir: ext2_readdir,
ioctl: ext2_ioctl,
fsync: ext2_sync_file,
};
:后面的是函数,前面的好像也是一个函数,同样编译不过,不知道咋来修改它

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧