我了解到,使用vfork()系统调用创建的新进程在父进程的地址空间中作为线程执行,并且在子线程不调用exit()或exec()系统调用之前,父进程将被阻塞。因此,我使用vfork()系统调用编写了一个程序
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid;
printf("Parent\n");
pid = vfork();
if(pid==0)
{
printf("Child\n");
}
return 0;
}我得到的输出如下:
Parent
Child
Parent
Child
Parent
Child
....
....
....我假设return语句必须在内部调用exit()系统调用,因此我期望输出仅为
Parent
Child有没有人能解释一下,为什么它实际上没有停止并连续打印无限循环。
发布于 2011-05-20 20:15:09
您应该仔细阅读vfork的手册页:
vfork()函数与fork(2)具有相同的效果,不同之处在于,如果vfork()创建的进程修改用于存储来自vfork()的返回值的pid_t类型变量以外的任何数据,或者从调用vfork()的函数返回,或者在成功调用_exit(2)或exec(3)系列函数之一之前调用任何其他函数,则行为未定义。
(以上内容来自手册页的POSIX部分,因此(可能)适用于Linux以外的其他环境)。
您正在调用printf并从子进程返回,因此您的程序的行为是未定义的。
https://stackoverflow.com/questions/6071670
复制相似问题