很久以前,我去伦敦一家非常奇怪的公司面试,这家公司自称是 Unix 专家顾问。不管怎样,这些人都是疯子,毫不奇怪,这家公司似乎已经不存在了,但在面试时他们问了我以下问题:
您启动新流程的第一个电话是什么?
所以我回答说第一个电话是fork
。采访我的两个人说(非常坚持,好像我错过了一些非常明显的事情)
你打什么电话前你做叉子吗?
现在,我对这个问题一无所知,我不得不说,这些人让我相信他们是彻头彻尾的白痴,原因与这个问题完全无关,但出于某种原因,这个问题现在仍然困扰着我。在分叉之前是否进行了一些调用?我是否错过了一些微妙之处?
答案1
我犹豫是否将此作为答案,因为人们只能猜测,但是:
- 刷新标准输出,以防子进程要在 exec 之前进行输出。
关闭所有大于 2 的打开文件描述符,假设新进程需要从 shell 获得的“标准”环境。- 一些晦涩的变体需要一些晦涩的东西,例如尤尼斯尽管他们很聪明,但他们还是知道这一点。
不管怎样,提出一个晦涩难懂的事实问题并不能得出关于候选人的任何信息,除非他们如何回答愚蠢的问题。
答案2
我的猜测是,它们意味着您应该调用“管道”来提供一种允许父进程控制子进程的标准输入或标准输出的方法。这是在“分叉”之前发生的最常见的调用。
我同意,这是一个糟糕的问题。如果他们指定您正在创建一个流程作为管道或类似内容的一部分,那么这将是一个很好的问题。了解操作的顺序很重要——在“fork”之前创建管道,然后关闭每个进程中相对的未使用的末端,使用“dup2”将子进程的描述符放在正确的位置,调用一些“exec” ' 孩子的功能,处理失败等等。
(事实上,它有专家猜测,这证明这是一个糟糕的问题。)
答案3
我的猜测是
- 要么他们正在考虑只适用于他们懒得提及的特定情况的东西,例如刷新缓冲区;
- 或者他们意味着你会做某事后分叉;
- 或者他们意味着你会做某事前
execve
(这是生成另一个程序的另一半),期待答案fork
,但他们并没有真正理解整个事情并将两者混淆。