亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果不是在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 關注
  • 225 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號