c - fork 从哪里开始执行表单?

标签 c linux segmentation-fault fork semaphore

对于我之前关于段错误的问题,我得到了非常有用的答案。感谢那些做出回应的人。

#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_openpsharedsem_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/

相关文章:

linux - 当 Dockerfile 存在于该文件夹中时,如何将任何文件夹复制到 Docker 容器?

python - 如何在 Linux 中使用带有 Python 的警告对话框?

C - 访问哈希表中的结构成员时出现段错误(插入函数)

c++ - 如何将更改的行与 C 代码的 git 存储库中的函数相关联?

c - 修改字符串文字

c - 在 C 中处理 stdin 上的输入

linux - 脚本将命令输出重定向到最后一个文件名参数

ios - 呈现模态 UIViewController 时发生奇怪的崩溃

rust - 取消引用从 Rust 传递给 C 的类型定义指针时的段错误

在 tmp 文件夹中创建一个临时文件夹 c 语言 Mac OS X