2016-06-06 4 views
3

Hier ist ein Codebeispiel, in dem der Bibliotheksaufruf fork verwendet wird, um einen untergeordneten Prozess zu erstellen, der den Adressraum des übergeordneten Elements freigibt. Der untergeordnete Prozess führt seinen Code aus, ohne den Systemaufruf exec zu verwenden. Meine Frage ist: Ist der Systemaufruf exec nicht erforderlich in dem Fall, dass sowohl die Eltern- als auch die Kindprozesse dasselbe Programm ausführen?Ist es möglich, Fork ohne Exec zu verwenden, wenn beide Prozesse dasselbe Programm ausführen?

#include <stdio.h> 
    int main() 
    { 
     int count; 
     count = fork(); 
     if (count == 0) 
      printf("\nHi I'm child process and count =%d\n", count); 
     else 
      printf("\nHi I'm parent process and count =%d\n", count); 
    return 0; 
} 
+4

Ja, das ist möglich und ziemlich häufig. –

+0

Nirgends steht geschrieben, dass man '' 'nach' 'Gabelung' ausführen muss. Dies bedeutet, dass Sie absolut "fork" sagen können, ohne 'exec' zu nennen. Daher ist unklar, was Sie fragen. –

+3

Nun ... nur weil die Antwort auf die Frage offensichtlich ist, bedeutet das nicht, dass es unklar ist, was die Frage ist. – Adrian

Antwort

2

Ist es möglich, Gabel ohne

exec zu verwenden Ja, es ist möglich.

ist der exec-Systemaufruf nicht in dem Fall erforderlich, dass sowohl die Eltern und Kind-Prozesse ausführen, sind mit dem gleichen Programm

Ja, es in diesem Fall nicht erforderlich ist.

1

Die Antwort auf diese Frage kann je nach Betriebssystem unterschiedlich sein. Die man-Seite für fork auf OS X enthält diese ominöse Warnung (fett Teil ist eine Umschreibung des Originals):

Es gibt Grenzen, was man in den untergeordneten Prozess zu tun. Um absolut sicher zu sein, sollten Sie sich darauf beschränken, nur async-signalsichere Operationen auszuführen, bis eine der exec Funktionen aufgerufen wird. Alle APIs, einschließlich globaler Datensymbole, in einem beliebigen Framework oder einer beliebigen Bibliothek sollten nach einem fork() als unsicher betrachtet werden, es sei denn, sie sind explizit als sicher oder async-signalsicher dokumentiert. Wenn Sie diese Frameworks im untergeordneten Prozess verwenden müssen, müssen Sie exec. In dieser Situation ist es sinnvoll, eine andere Kopie der gleichen ausführbaren Datei auszuführen.

Die Liste der Asynchron-Signal sichere Funktionen können in der Manpage für sigaction (2) finden.

+0

Was ist das? Nie von einer solchen Einschränkung bei der Verwendung von 'fork()' ... gehört. – alk

+0

Wäre es möglich, die relevante Dokumentation zu verknüpfen? – alk

+0

Related: http://stackoverflow.com/q/18854708/694576 Es scheint, dass die Einschränkung, auf die Sie verweisen, begrenzt ist, wenn Sie OSX-spezifische Funktionen verwenden. – alk

Verwandte Themen