没有得到分段错误

Not Getting Segmentation Fault

考虑这个简单的代码片段:

  {  
 if(fork())
 {
printf("Parent terminated\n"); 
}
 else
 {
   char *s = "hello world";
  *s = 'H';
 printf("child terminated\n");
 }
wait(NULL);
  return 0;
}

当我编译它时,我在分配给 *s 时没有收到我们预期的分段错误 输出是: 父终止(不打印子终止)

现在,如果我删除两行 char *s=......'H' 我会得到正常的输出。
有人可以解释一下吗

首先,其他人所说的是正确的:行为是未定义的,在执行此操作时你不能依赖任何特定的行为。

但是,我怀疑发生的事情是 child 实际上 有分段错误。然而,您在终端中看到的熟悉的 "Segmentation fault" 消息实际上是由您的 shell 在您 运行 段错误时打印的。

但是,由于这是您 运行 的 child,您的 shell 没有注意到。如果您配置了核心转储(例如 ulimit -c unlimited),我希望您会从 seg 故障 child 进程中找到一个核心文件。

首先,您不能保证会出现分段错误或任何定义的行为,以触发未定义的行为,例如修改字符串文字。尽管在 Linux 上,字符串文字被放入只读内存,因此在 Linux 上修改它们通常会导致分段错误。

那么为什么这段代码没有触发段错误?它确实存在,但你只是看不到它,因为你分叉了。

"Segmentation Fault (core dumped)" 消息由您的 shell(例如 bash)打印,当它通过调用 wait 检测到它生成的进程终止时SIGSEGV(段错误)信号。但是,您的 shell 不会收到任何有关子进程退出的通知;你的父进程会。

您的父进程调用 wait 等待并在终止时获取退出代码。如果您没有通过传入 NULL 来等待以忽略退出代码,您可能会看到退出代码是 -11-SIGSEGV.

所以这是段错误;您的父进程只是忽略了子进程出现段错误的通知。