C UNIX getfs(开发人员)
我目前正在探索UNIX源代码,我很难理解其中的很多内容C UNIX getfs(开发人员),c,unix,C,Unix,我目前正在探索UNIX源代码,我很难理解其中的很多内容 getfs(dev) { register struct mount *p; register char *n1, *n2; for(p = &mount[0]; p < &mount[NMOUNT]; p++) if(p->m_bufp != NULL && p->m_dev == dev) { p = p->m_bufp->b
getfs(dev)
{
register struct mount *p;
register char *n1, *n2;
for(p = &mount[0]; p < &mount[NMOUNT]; p++)
if(p->m_bufp != NULL && p->m_dev == dev) {
p = p->m_bufp->b_addr;
n1 = p->s_nfree;
n2 = p->s_ninode;
if(n1 > 100 || n2 > 100) {
prdev("bad count", dev);
p->s_nfree = 0;
p->s_ninode = 0;
}
return(p);
}
panic("no fs");
}
getfs(dev)
{
寄存器结构挂载*p;
寄存器字符*n1,*n2;
对于(p=&mount[0];p<&mount[NMOUNT];p++)
如果(p->m_bufp!=NULL&&p->m_dev==dev){
p=p->m_bufp->b_addr;
n1=p->s_自由度;
n2=p->s_ninode;
如果(n1>100 | n2>100){
prdev(“错误计数”,dev);
p->s_nfree=0;
p->s_ninode=0;
}
回报率(p);
}
恐慌(“无fs”);
}
在if语句后的第一行,我们尝试访问p->m_bufp->b_addr
。当p->m_bufp
是int*
时,这怎么可能发生呢。在那之后,我们甚至将所有这些赋值给类型为struct mount*
的变量
有人能解释一下我遗漏了什么吗?是指向完整源代码的链接
提前谢谢你!祝你度过愉快的一天。你说得对,它不能工作。是否有可以编译的实际源代码?版本6 Unix™? 谈论“旧”——这要追溯到1978年(大约1976年)。C在当时是一种非常不同的语言。函数定义行
getfs(dev)
相当于intgetfs(intdev)
。panic()
调用将不会返回。而且它可能来自这样一个时代:结构成员跨所有结构类型位于一个名称空间中,而不是每个结构类型位于一个单独的名称空间中。只要指针是指针,就可以取消引用它。@EugeneSh。“我找不到,但我很期待看到它。”乔纳坦利弗勒,谢谢。我不知道。这很有帮助。你觉得我该怎么办?是否有任何版本的UNIX使用更现代的C语言实现,或者这完全是浪费时间?如果您想了解UNIX内核,您可能会使用比V6更高的版本,例如,您可以在上找到更高的版本(如V7)。V7UNIX(我开始使用的,或多或少)可以追溯到1978年。它使用了一个更现代的C版本,一个对结构类型等不太宽松的版本。它仍然是K&R C(标准C在未来仍然是十年),但与K&R第一版Edn(1978年)非常接近。任何较新版本的Unix都将相应地更接近于使用标准C—它将更容易理解(但仍然不容易)。你是对的,它无法工作。是否有可以编译的实际源代码?版本6 Unix™? 谈论“旧”——这要追溯到1978年(大约1976年)。C在当时是一种非常不同的语言。函数定义行getfs(dev)
相当于intgetfs(intdev)
。panic()
调用将不会返回。而且它可能来自这样一个时代:结构成员跨所有结构类型位于一个名称空间中,而不是每个结构类型位于一个单独的名称空间中。只要指针是指针,就可以取消引用它。@EugeneSh。“我找不到,但我很期待看到它。”乔纳坦利弗勒,谢谢。我不知道。这很有帮助。你觉得我该怎么办?是否有任何版本的UNIX使用更现代的C语言实现,或者这完全是浪费时间?如果您想了解UNIX内核,您可能会使用比V6更高的版本,例如,您可以在上找到更高的版本(如V7)。V7UNIX(我开始使用的,或多或少)可以追溯到1978年。它使用了一个更现代的C版本,一个对结构类型等不太宽松的版本。它仍然是K&R C(标准C在未来仍然是十年),但与K&R第一版Edn(1978年)非常接近。任何较新版本的Unix都将相应地更接近于使用标准C—它将更容易理解(但仍然不容易)。