使用vfork()时为什么会出错?

时间:2009-04-08 19:07:35

标签: c++ operating-system fork

这是我的代码......我不知道为什么我会得到一个错误段...有人可以向我解释原因吗?

#include <iostream>

#include <string>

// Required by for routine
#include <sys/types.h>
#include <unistd.h>

using namespace std;


int globalVariable = 2;

main()
{
   string sIdentifier;
   int    iStackVariable = 20;

   pid_t pID = vfork();
   if (pID == 0)                // child
   {
      // Code only executed by child process

      sIdentifier = "Child Process: ";
      globalVariable++;
      iStackVariable++;
      cout << "PROCESO NUMERO"<<getpid()<<sIdentifier;
//          printf("Proceso hijo: PID %d - PPID %d\n", getpid(), getppid());
      cout << " Global variable: " << globalVariable;
      cout << " Stack variable: "  << iStackVariable << endl;
      return (0);
    }
    else if (pID < 0)            // failed to fork
    {
        cerr << "Failed to fork" << endl;
        return (1);
        // Throw exception
    }
    else                                   // parent
    {
      // Code only executed by parent process

      sIdentifier = "Parent Process:";
    }

    // executed only by parent

    cout << sIdentifier;
    cout << " Global variable: " << globalVariable;
    cout << " Stack variable: "  << iStackVariable << endl;
    return (0);
}

2 个答案:

答案 0 :(得分:6)

是否使用this ?请注意有关变量修改的警告。

  

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

答案 1 :(得分:1)

如果你vfork()两个进程共享一个地址空间。你应该只使用vfork(),如果你要在孩子中立即执行另一个进程。创建系统调用的原因是为了避免复制父进程的地址空间中的每个页面的开销,只是为了让子exec的所有这些映射都被丢弃。对于您的情况,请改用fork()。