Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C UNIX getfs(开发人员)_C_Unix - Fatal编程技术网

C UNIX getfs(开发人员)

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

我目前正在探索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_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—它将更容易理解(但仍然不容易)。