对于我之前关于段错误的问题,我得到了非常有用的答案。感谢那些做出回应的人。
#include<stdio.h>
main()
{
printf("hello");
int pid = fork();
wait(NULL);
}
输出:hellohello。
子进程从头开始执行。 如果我没有错,那么如果我将 sem_open 放在 fork() 之前,程序将如何工作 (引用:上一个问题的答案)
我需要对偶尔发生但并非总是发生的段错误进行清晰的解释。为什么不总是......如果编码中有任何错误,那么它应该总是正确地发生......?
最佳答案
fork
创建您的流程的克隆。从概念上讲,父级的所有状态也最终会传递给子级。这包括:
- CPU 寄存器(包括指令指针,它定义程序在代码中的位置)
- 内存(作为一种优化,您的内核很可能将所有页面标记为写时复制,但从语义上讲,它应该与复制所有内存相同。)
- 文件描述符
因此...您的程序不会从任何地方“开始运行”...您调用 fork
时的所有状态会传播给 child 。 child 将从fork
返回正如 parent 所愿。
至于 fork 后你可以做什么...我不确定 POSIX 说什么,但我不会依赖信号量在 fork
之后做正确的事情。 。您可能需要进程间信号量(请参阅 man sem_open
或 pshared
的 sem_init
参数)。根据我的经验,跨进程信号量在免费的 Unix 类型操作系统上并没有得到很好的支持...(例如:如果您尝试创建一个 BSD,某些 BSD 总是会失败并显示 ENOSYS
。)
@GregS 提到了 fork 后重复的“hello”字符串。他说 stdio (即 FILE*
)将在用户空间内存中缓冲,并且 fork
是正确的。导致字符串在两个进程中被缓冲。您可能想调用fflush(stdout); fflush(stderr);
并刷新任何其他重要的FILE*
fork
之前的句柄.
关于c - fork 从哪里开始执行表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5206374/