首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vfork()系统调用

vfork()系统调用
EN

Stack Overflow用户
提问于 2011-05-20 20:09:25
回答 1查看 6.8K关注 0票数 5

我了解到,使用vfork()系统调用创建的新进程在父进程的地址空间中作为线程执行,并且在子线程不调用exit()或exec()系统调用之前,父进程将被阻塞。因此,我使用vfork()系统调用编写了一个程序

代码语言:javascript
复制
#include <stdio.h>  
#include <unistd.h>

int main()  
 {  
      pid_t pid;  
      printf("Parent\n");  
      pid = vfork();  
      if(pid==0)  
      {  
          printf("Child\n");  
      }  
      return 0;  
  }

我得到的输出如下:

代码语言:javascript
复制
 Parent  
 Child  
 Parent  
 Child  
 Parent  
 Child  
 ....  
 ....  
 ....

我假设return语句必须在内部调用exit()系统调用,因此我期望输出仅为

代码语言:javascript
复制
Parent  
Child

有没有人能解释一下,为什么它实际上没有停止并连续打印无限循环。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-20 20:15:09

您应该仔细阅读vfork的手册页:

vfork()函数与fork(2)具有相同的效果,不同之处在于,如果vfork()创建的进程修改用于存储来自vfork()的返回值的pid_t类型变量以外的任何数据,或者从调用vfork()的函数返回,或者在成功调用_exit(2)或exec(3)系列函数之一之前调用任何其他函数,则行为未定义。

(以上内容来自手册页的POSIX部分,因此(可能)适用于Linux以外的其他环境)。

您正在调用printf并从子进程返回,因此您的程序的行为是未定义的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6071670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档