#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等待。

慕的地8271018
TA貢獻1796條經驗 獲得超4個贊
挺好玩的, 我這邊看到是子進程可以退出, 父進程必定 segment fault
.
vfork
, 子進程在exec
或exit
之前, 用的是父進程的地址空間.在子進程在
exec
或exit
之前, 父進程被掛起.
所以子進程先退出, 退出后 內核 釋放進程內存空間, 因為這里子父進程用的是一個地址空間, 就把父進程搞死了.
嗯, 這種行為是undefine
. 另一臺機子, 結果是 Illegal instruction
- 2 回答
- 0 關注
- 225 瀏覽
添加回答
舉報
0/150
提交
取消