Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么vWork()会出现分段错误_C_Process_Linux Kernel_Vfork - Fatal编程技术网

C 为什么vWork()会出现分段错误

C 为什么vWork()会出现分段错误,c,process,linux-kernel,vfork,C,Process,Linux Kernel,Vfork,当我运行以下代码时 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { pid_t pid; pid = vfork(); printf("hello world\n"); } Output: hello world hello world hello world Segmentation fault #包括 #包括 #包括 int main(

当我运行以下代码时

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    pid_t pid;
    pid = vfork();
    printf("hello world\n");
}
Output:
hello world
hello world
hello world
Segmentation fault
#包括
#包括
#包括
int main()
{
pid_t pid;
pid=vfork();
printf(“hello world\n”);
}
输出:
你好,世界
你好,世界
你好,世界
分段故障
我知道,除非调用exec()或_exit(),否则如果我们试图修改任何变量,vWork()可能会以奇怪的方式运行,但有人能解释到底发生了什么吗??为什么hello world会被打印3次?是因为printf()被缓冲了吗?最后,为什么seg故障发生在家长试图返回的时候

函数的作用与fork(2)相同, 但如果由创建的进程 vWork()修改除pid类型的变量之外的任何数据 用于存储vfork()的返回值,或从 调用vWork()的函数,或调用任何其他函数 在成功调用_exit(2)或 功能


似乎您违反了使用vWork的所有条件。那么它就不起作用了。

我写的这段代码是一场灾难,将以一种未定义的方式运行,但对这种行为的合理解释可能是:-


由于地址空间是共享的,并且当子级不是通过
\u exit()
exec()
返回时,将执行I/O缓冲区刷新(这将导致额外的hello world语句),并且在清理过程中,当释放
printf()
的内存时,它可能会在堆栈帧上进行函数调用,而家长仍然被卡住。返回时,父级可能在堆栈上没有任何返回地址可返回给任何人,这将导致分段错误

如果您知道它正在调用一个未定义的行为,为什么您要询问具体的行为?这就是未定义行为的含义,否则无法解释,它将被定义为“以奇怪的方式行为”不是“具有未定义行为”的良好表征。特别是,segfault的失败在很大程度上是在未定义行为的任意范围内。打印“hello world”三次也是如此,不管您的程序中是否有任何代码可以解释这种输出。你不能合法地对未定义的行为进行推理。