Почему я получаю ошибку при использовании vfork ()? - PullRequest
0 голосов
/ 08 апреля 2009

Это мой код ... Я не знаю, почему у меня появляется сегмент ошибки ... Может кто-нибудь объяснить мне причину?

#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 ]

6 голосов
/ 08 апреля 2009

это использования? Обратите внимание на предостережения, связанные с модификацией переменных.

Функция vfork () имеет тот же эффект, что и fork (), за исключением того, что поведение не определено, если процесс, созданный vfork (), изменяет любые данные, кроме переменной типа pid_t, используемой для хранения возвращаемого значения из vfork (), либо возвращает функцию, в которой была вызвана vfork (), либо вызывает любую другую функцию перед успешным вызовом _exit () или одной из функций семейства exec.

1 голос
/ 08 апреля 2009

Если вы используете vfork (), оба процесса совместно используют адресное пространство. Вероятно, вам следует использовать vfork () только в том случае, если вы собираетесь выполнить другой процесс почти сразу же в дочернем процессе. Причина, по которой был создан системный вызов, состояла в том, чтобы избежать накладных расходов на копирование каждой страницы в адресном пространстве родительского процесса только для того, чтобы все эти сопоставления отбрасывались при выполнении дочернего exec. Для вашего случая используйте fork ().

...