标签: internals

fork()如何知道何时返回0?

请看以下示例:

int main(void)
{
     pid_t  pid;

     pid = fork();
     if (pid == 0) 
          ChildProcess();
     else 
          ParentProcess();
}
Run Code Online (Sandbox Code Playgroud)

所以纠正我,如果我错了,一旦fork()执行子进程被创建.现在通过这个答案 fork()返回两次.这对于父进程来说是一次,对于子进程则是一次.

这意味着在fork调用期间存在两个独立的进程,而不是在结束之后.

现在我不明白它如何理解如何为子进程返回0以及为父进程返回正确的PID.

这让它变得非常混乱.这个回答指出fork()通过复制进程的上下文信息并手动将返回值设置为0来工作.

首先,我说对任何函数的返回都放在一个寄存器中吗?因为在单个处理器环境中,进程只能调用一个只返回一个值的子例程(如果我错了,请纠正我).

假设我在例程中调用函数foo()并且该函数返回一个值,该值将存储在一个名为BAR的寄存器中.每次函数想要返回一个值时,它将使用特定的处理器寄存器.因此,如果我能够手动更改过程块中的返回值,我可以更改返回到函数的值吗?

所以我认为fork()的工作原理是正确的吗?

c unix fork process internals

49
推荐指数
4
解决办法
4907
查看次数

object_id赋值如何工作?

我正在玩Ruby,.object_id并注意到,在irb的几个连续会话中,我得到了相同的结果:

false.object_id // 0
true.object_id // 2
nil.object_id // 4
100.object_id // 201
Run Code Online (Sandbox Code Playgroud)

实际上,每个整数的object_id似乎都是((value*2)+ 1).

另一方面,在退出并重新运行irb之后,给定字符串的object_id永远不会相同.

这为我提出了几个问题:

  1. 是否有已知的方案object_id确定某些s?其他人基本上是随机的
  2. true,false和nil的id不是顺序的.有没有办法询问给定id表示的对象是什么?(我很好奇其他一位数和ids的关系.)
  3. 你可以(不是你应该)编写模糊的Ruby,你使用已知的对象id引用对象而不命名它们,比如"id 201的对象+ id为19的对象"意味着"100 + 9"?

更新

使用Andrew Grimm的建议,我尝试发现其他"低id"对象,但发现:

  • 在这个序列中似乎没有任何更多的偶数对象 - ids 6,8,10等不指向任何东西.
  • 正如我之前的实验所暗示的那样,所有奇数编号的id都属于数字.具体地,id 1指向数字0,3指向1,5指向2,依此类推.

ruby internals

43
推荐指数
2
解决办法
1万
查看次数

什么构成Git中的合并冲突?

git如何确定特定合并是否存在冲突以及冲突是什么?

我的猜测会是这样的:如果合并的两个提交有一个共同的父提交,并且如果他们都改变了父级的X行,那就是冲突.

使我的理解复杂化的是:

  • "更改行X"可能意味着用几个新行替换它,并且仍然显示为一个冲突(版本A有这一行,版本B有这5行,或者其他)
  • 如果你在其中一个提交中插入了行,那么dumber算法会认为所有后续行都已经改变了:第30行现在具有第25行的前内容,31具有前者26的内容,等等.但是git可以告诉那些是一样的,我不知道怎么做.

任何人都可以解释这是如何工作的,或者指向一个链接吗?

git internals

40
推荐指数
2
解决办法
6124
查看次数

如何在内部实现java接口?(虚函数表?)

C++有多重继承.在程序集级别实现多重继承可能非常复杂,但在线上有关于如何正常完成(vtables,指针修正,thunks等)的良好描述.

Java没有多个实现继承,但它确实有多个接口继承,所以我不认为每个类有一个vtable的直接实现可以实现它.java如何在内部实现接口?

我意识到与C++相反,Java是Jit编译的,因此不同的代码片段可能会有不同的优化,不同的JVM可能会做不同的事情.那么,是否存在许多JVM遵循的一般策略,或者有人知道特定JVM中的实现吗?

此外,JVM通常是虚拟化和内联方法调用,在这种情况下根本没有涉及vtable或等效项,因此询问实现虚拟/接口方法调用的实际汇编序列可能没有意义,但我认为大多数JVM仍然保留一些如果类无法将所有内容虚拟化,那么这些类的一般表示形式即可使用.这个假设是错的吗?这种表示形式是否像C++ vtable一样?如果是这样,接口有单独的vtable,它们如何与类vtable链接?如果是这样,对象实例可以有多个vtable指针(对于类/接口vtable),就像C++中的对象实例一样吗?对同一对象的类类型和接口类型的引用是否总是具有相同的二进制值,或者它们是否可以像C++中那样需要指针修复?

(供参考:这个问题提出了类似CLR的相似之处,这篇msdn文章似乎有一个很好的解释,虽然现在可能已经过时了.我找不到任何类似的Java.)

编辑:

  • 我的意思是"实现",意思是"GCC编译器如何实现整数加法/函数调用/等",而不是"Java类ArrayList实现List接口".
  • 我知道这在JVM字节码级别是如何工作的,我想知道的是在完成加载类文件和编译字节码之后JVM会生成什么样的代码和数据结构.

java interface language-implementation internals vtable

39
推荐指数
1
解决办法
8581
查看次数

了解如何在R中处理.Internal C函数

我想知道是否有人可以向我说明R如何C从控制台提示符下键入的R命令执行调用.我R对a)函数参数的处理和b)函数调用本身特别困惑.

在这种情况下,我们举一个例子set.seed().想知道它是如何工作我在提示符下键入名称,获得源(看看这里的更多介绍),看到有最后一个.Internal(set.seed(seed, i.knd, normal.kind),所以尽职尽责地在查找相关的函数名.Internals的部分/src/names.c,发现它被称为do_setseed是在RNG.c哪导致我......

SEXP attribute_hidden do_setseed (SEXP call, SEXP op, SEXP args, SEXP env)
{
    SEXP skind, nkind;
    int seed;

    checkArity(op, args);
    if(!isNull(CAR(args))) {
    seed = asInteger(CAR(args));
    if (seed == NA_INTEGER)
        error(_("supplied seed is not a valid integer"));
    } else seed = TimeToSeed();
    skind = CADR(args);
    nkind = CADDR(args);
    //...
      //DO RNG here 
    //...
    return R_NilValue;
}
Run Code Online (Sandbox Code Playgroud)
  • 什么是CAR,CADR …

c syntax r internals

39
推荐指数
2
解决办法
1437
查看次数

如果Java的垃圾收集器移动对象,那么什么是Object.hashCode和System.identityHashCode?

我经常听说这些方法(Object.hashCodeSystem.identityHashCode)返回对象的地址,或者从地址快速计算的东西; 但我也很确定垃圾收集器会移动并压缩物体.由于哈希码不能改变,这就出现了问题.我知道这不是人们日常工作需要知道的事情,但我想了解内部情况.那么,有谁知道这是如何在Java中实现的?或.NET,因为它们可能类似.

java garbage-collection internals hashcode object-identity

35
推荐指数
1
解决办法
2084
查看次数

当文件路径超过大约时,内部会发生什么.Windows中32767个字符?

在Windows(假设2000以后)中,文件路径的长度最多约为32767个字符.由于UNICODE_STRING本机API(也在内核端,驱动程序等)中的内部处理,存在此限制.到现在为止还挺好.我知道那部分背后的理论.

限制的原因是Length和count的MaximumLength成员UNICODE_STRING计数中的字节数Buffer,但是16位无符号整数本身.

我也知道为什么限制是近似而不是设定限制.这主要是由于您的文件名(例如\\.\C:\boot.ini)如何被解析为其本机形式(例如\??\C:\boot.ini),然后是以实际卷设备名称为前缀然后跟随相对于该卷的路径的东西,例如\Device\HarddiskVolume2\boot.ini.

此外,从Windows资源管理器中,达到("ANSI")MAX_PATH限制时的已知症状是假装某些版本的Windows中不存在文件或文件夹(可能在某些时候已修复).

但是,在对象管理器,I/O管理器和文件系统驱动程序级别分别发生时,我打电话CreateFile()与看起来像一个路径\\.\C:\...\filename.ext和整个路径并没有超过限制,但达到它,我呼吁kernel32.dllCreateFile(),并随后得到扩大呢?...

SDK和WDK似乎都没有特别讨论这个话题.还是我看错了?

windows winapi internals

32
推荐指数
1
解决办法
1621
查看次数

Python的内部列表,访问和调整运行时的大小

Python []是列表还是数组?
索引O(1)的访问时间是否像数组一样,O(n)是否像列表一样?
是将O(1)像列表一样追加/调整大小,还是像数组一样调整O(n),还是可以管理O(1)来访问和调整大小?

在这里读到 Python中的数组访问速度非常慢.然而,当我使用字典(Python的字典假设非常快)和列表编写了一个递归的fibonacci过程的memoized版本时,它们有相同的时间.为什么是这样?

Python元组的访问时间是否比python列表快?

python time space list internals

30
推荐指数
2
解决办法
1万
查看次数

使内部类对其他程序集可见

是否可以使我的程序集内部类对其他程序集可见?

我知道AssemblyInfo文件和[assembly: InternalsVisibleTo()]属性,但它在我的情况下不起作用.

主要目的是使从LINQPAD调用方法成为可能,因此这[assembly: InternalsVisibleTo("LINQPad")]不起作用.我不知道为什么.在我的项目中,我使用依赖解析器,在LINQPAD中很难做到这一点.有什么建议?

c# internals linqpad

28
推荐指数
2
解决办法
3万
查看次数

如何获取结构中的位数组?

我正在思考(因此我正在寻找一种方法来学习这个,而不是更好的解决方案),如果有可能在结构中获得一个位数组.

让我举一个例子来证明.想象一下这样的代码:

#include <stdio.h>

struct A
{
    unsigned int bit0:1;
    unsigned int bit1:1;
    unsigned int bit2:1;
    unsigned int bit3:1;
};

int main()
{
    struct A a = {1, 0, 1, 1};
    printf("%u\n", a.bit0);
    printf("%u\n", a.bit1);
    printf("%u\n", a.bit2);
    printf("%u\n", a.bit3);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,我们在结构中包含4个单独的位.它们可以单独访问,将位操作的工作留给编译器.我想知道的是,如果这样的事情是可能的:

#include <stdio.h>

typedef unsigned int bit:1;

struct B
{
    bit bits[4];
};

int main()
{
    struct B b = {{1, 0, 1, 1}};
    for (i = 0; i < 4; ++i)
        printf("%u\n", b.bits[i]);
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c c++ internals

27
推荐指数
2
解决办法
2万
查看次数