fork开始执行表单在哪里?

Mut*_*han -1 c linux fork semaphore segmentation-fault

对于我之前关于分段错误的问题,我得到了非常有用的答案.谢谢那些已经回复的人.

#include<stdio.h>
main()
{
 printf("hello");
int pid = fork();
wait(NULL);
}
Run Code Online (Sandbox Code Playgroud)

输出:hellohello.

在此,子进程从头开始执行.如果我没有错,那么如果我把sem_open放在fork()之前程序是如何工作的(ref答案:prev questions)

我需要一个关于分段故障的清晰解释,这种故障偶尔发生而不是总是发生 为什么不总是...如果编码中有任何错误,那么它应该始终正确...?

asv*_*kau 6

fork创建进程的克隆.从概念上讲,父母的所有状态也最终都在孩子身上.这包括:

  • CPU寄存器(包括指令指针,它定义程序在代码中的位置)
  • 内存(作为优化,您的内核很可能将所有页面标记为写时复制,但从语义上讲,它应该与复制所有内存相同.)
  • 文件描述符

因此......你的程序不会从任何地方"开始运行"......你所调用的所有状态都fork将传播给孩子.孩子将fork像父母一样返回.

至于你在fork之后可以做些什么...我不确定POSIX说的是什么,但是我不会依赖信号量做出正确的事情fork.您可能需要进程间信号量(请参阅man sem_openpshared参数sem_init).根据我的经验,跨进程信号量在免费的Unix类型操作系统上并没有得到很好的支持......(例如:ENOSYS如果你试图创建一个BSD,它们总会失败.)

@GregS在fork之后提到了重复的"hello"字符串.他说stdio(即FILE*)将在用户空间内存中缓冲,并且a fork导致字符串在两个进程中缓冲是正确的.您可能希望在调用之前调用fflush(stdout); fflush(stderr);并刷新任何其他重要FILE*句柄fork.