为了账号安全,请及时绑定邮箱和手机立即绑定

如果不是在main函数中而是在另一个函数中调用vfork,以后子进程从该函数返回时,会发生什么情况?

如果不是在main函数中而是在另一个函数中调用vfork,以后子进程从该函数返回时,会发生什么情况?

呼啦一阵风 2023-04-18 19:15:30
#include <stdio.h>#include <pthread.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#define P_INFO printf("chld %u, self %u, father %u \n", pid, getpid(), getppid())void err_sys (const char* val){  fprintf(stdout, val);  return; }void func (void){  pid_t pid = -1;    pid = vfork();  if (pid < 0) {    err_sys("vfork failed\n");   }  if ( pid == 0) {    printf("child 2\n");     P_INFO;    return;   }  if (pid > 0) {    printf("father 1 func\n");     P_INFO;             return;   } }void funf (void){  pid_t pid = getpgrp();   P_INFO;  return; }int main (int argc, char** argv) {  pid_t pid = getpgrp();  printf("father 1\n");  func();  printf("father 1, out func to funf\n");  funf();  printf("father 1, out funf to exit\n");   P_INFO;  return 0; }
查看完整描述

2 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

你这样完全是在滥用api。你应该搞清楚vfork是用来做什么的。在vfork()产生的子进程结束或者调用exec之前,父进程应当使用wait等待。

查看完整回答
反对 回复 2023-04-22
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

挺好玩的, 我这边看到是子进程可以退出, 父进程必定 segment fault.

  1. vfork, 子进程在execexit之前, 用的是父进程的地址空间.

  2. 在子进程在execexit之前, 父进程被挂起.

所以子进程先退出, 退出后 内核 释放进程内存空间, 因为这里子父进程用的是一个地址空间, 就把父进程搞死了.


嗯, 这种行为是undefine. 另一台机子, 结果是 Illegal instruction


查看完整回答
反对 回复 2023-04-22
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信