没有得到分段错误
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
.
所以这是段错误;您的父进程只是忽略了子进程出现段错误的通知。
考虑这个简单的代码片段:
{
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
.
所以这是段错误;您的父进程只是忽略了子进程出现段错误的通知。