2016-04-16 9 views
1

Meine Aufgabe erfordert, dass ich das Prinzip der Prozessbehandlung kapsle.Encapsulation of Process führt zu unerwartetem Verhalten

Hier ist, was meine Klasse Process enthält:

class Process 
{ 
public: 
    Process(); 
    ~Process(); 

    pid_t getPid() const; 

private: 
    pid_t   pid_; 
}; 

Constructor:

Process::Process() 
{ 
    this->pid_ = fork(); 
} 

Destructor:

Process::~Process() 
{ 
    if (this->pid_ > 0) 
    kill(this->pid_, SIGKILL); 
} 

Hier ist das Problem: Nach dem Einkapseln und die Schaffung eines Objekts wie solche:

void example() 
{ 
    Process  pro; 

    if (pro.pid_ == 0) 
    { 
     // Child Process                          
    } 
    else if (pro.pid_ < 0) 
    { 
     // Error                           
    } 
    else 
    { 
     // Parent Process                          
    } 
} 

Mein Programm fast nie den Code eingibt, aber wenn ich fork() normalerweise (ohne Kapselung) funktioniert es wie ein Charme.

Wo bin ich falsch gelaufen? Wie kann ich das Kind und die Eltern synchronisieren, um sicherzustellen, dass beide ihre Arbeit machen?

+1

Dieser Code möglicherweise nicht zusammenstellen können. 'pid_' ist eine private Variable, auf die von example() nicht zugegriffen werden kann. Bitte poste nicht imaginären Code, sondern stattdessen [mcve]. Andernfalls wird Ihre Frage abgelehnt und geschlossen. –

Antwort

0

Ich kann Ihr Beispiel nicht überprüfen, aber ich sehe einen offensichtlichen Fehler in Ihrer Klasse Process. Es definiert benutzerdefinierten Konstruktor und Destruktor, aber Zuweisungsoperator ist nicht definiert, was die rule of three verletzt.

Betrachten Sie folgenden Code:

void example() 
{ 
    Process pro; 
    { 
     Process pro2 = pro; 
    } 
    // here pro.pid_ will have id of the already killed process 
} 
Verwandte Themen