0

これは私のコードです...エラーセグメントが表示される理由がわかりません...誰かが理由を説明してくれませんか?

#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);
}
4

2 に答える 2

6

これは役に立ちますか?変数の変更に関する注意事項に注意してください。

vfork() 関数は fork() と同じ効果がありますが、vfork() によって作成されたプロセスが、vfork() からの戻り値を格納するために使用される pid_t 型の変数以外のデータを変更した場合の動作は未定義です。または、vfork() が呼び出された関数から戻るか、_exit() または関数の exec ファミリの 1 つを正常に呼び出す前に、他の関数を呼び出します。

于 2009-04-08T19:15:11.333 に答える
1

vfork() すると、両方のプロセスがアドレス空間を共有しています。子プロセスですぐに別のプロセスを実行する場合にのみ、vfork() を使用する必要があります。システム コールが作成された理由は、親プロセスのアドレス空間内のすべてのページをコピーして、子の実行時にすべてのマッピングを破棄するというオーバーヘッドを回避するためです。あなたの場合、代わりに fork() を使用してください。

于 2009-04-08T19:46:34.753 に答える