如果不是在main函数中而是在另一个函数中调用vfork,以后子进程从该函数返回时,将会发生什么情况?
#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; }
哦.明白了...
挺好玩的, 我这边看到是子进程可以退出, 父进程必定 segment fault
.
-
vfork
, 子进程在exec
或exit
之前, 用的是父进程的地址空间. - 在子进程在
exec
或exit
之前, 父进程被挂起.
所以子进程先退出, 退出后 内核 释放进程内存空间, 因为这里子父进程用的是一个地址空间, 就把父进程搞死了.
嗯, 这种行为是undefine
. 另一台机子, 结果是 Illegal instruction
你这样完全是在滥用api。你应该搞清楚vfork是用来做什么的。在vfork()产生的子进程结束或者调用exec之前,父进程应当使用wait等待。