Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist der Unterschied zwischen fork() und exec() in C? Ein einfacher Vergleich zwischen fork() und exec()

Was ist der Unterschied zwischen fork() und exec() in C? Ein einfacher Vergleich zwischen fork() und exec()

青灯夜游
青灯夜游Original
2019-04-01 15:02:006088Durchsuche

Jede Anwendung (Programm) wird durch einen Prozess ausgeführt, bei dem es sich um eine laufende Programminstanz handelt. Prozesse werden durch verschiedene Systemaufrufe erstellt. Die beliebtesten sind fork() und exec(). Was ist also der Unterschied zwischen ihnen? Der folgende Artikel stellt Ihnen den Unterschied zwischen fork() und exec() vor und hoffe, dass er Ihnen hilfreich sein wird.

Was ist der Unterschied zwischen fork() und exec() in C? Ein einfacher Vergleich zwischen fork() und exec()

fork() in C-Sprache

pid_t pid = fork();

fork() wird durch Kopieren des aufrufenden Prozesses erstellt Ein neuer Prozess wird mit einer neuen PID erzeugt, und der neue Prozess (untergeordneter Prozess genannt) ist eine exakte Kopie des aufrufenden Prozesses (übergeordneter Prozess genannt). Die beiden Prozesse sind bis auf Folgendes nahezu identisch: 1. Der untergeordnete Prozess verfügt über eine eigene eindeutige Prozess-ID, und diese PID stimmt nicht mit der ID einer vorhandenen Prozessgruppe überein.

2. Die übergeordnete Prozess-ID des untergeordneten Prozesses ist dieselbe wie die ID des aufrufenden Prozesses.

3. Das Kind erbt nicht die Speichersperre und die Semaphor-Anpassung seines Elternteils.

4. Das untergeordnete Element erbt weder unvollendete asynchrone E/A-Vorgänge von seinem übergeordneten Element, noch erbt es einen asynchronen E/A-Kontext von seinem übergeordneten Element.

Der Rückgabewert von fork()

fork() akzeptiert keine Parameter und gibt einen ganzzahligen Wert zurück. Unten sind die verschiedenen Werte aufgeführt, die von fork() zurückgegeben werden.

● Negativer Wert: Der untergeordnete Prozess konnte nicht erstellt werden.

● Null: Rückkehr zum neu erstellten untergeordneten Prozess.

●Positiver Wert: Zurück zum Elternteil oder Anrufer. Dieser Wert enthält die Prozess-ID des neu erstellten untergeordneten Prozesses.

Hinweis: Bei Erfolg wird die PID des untergeordneten Prozesses im übergeordneten Prozess und 0 im untergeordneten Prozess zurückgegeben. Bei einem Fehler wird im übergeordneten Prozess -1 zurückgegeben, der untergeordnete Prozess wird nicht erstellt und errno wird entsprechend festgelegt.

Die exec()exec()-Funktionsreihe in der Sprache C ersetzt das aktuelle Prozessabbild durch ein neues Prozessabbild. Es lädt das Programm in den aktuellen Prozessraum und führt es vom Einstiegspunkt aus aus.

Beispiel: Wir haben execv() im folgenden C-Programm implementiert. Die exec()-Reihe besteht aus den folgenden Funktionen:

int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[],char *const envp[]);

fork() und exec(. )1. fork() erstellt und startet einen neuen Prozess, der eine Kopie des Prozesses ist, der ihn aufgerufen hat, während exec() einen anderen verwendet Das (andere) Prozessabbild ersetzt das aktuelle Prozessabbild und das „Datensegment“, „Stapelsegment“ und „Codesegment“ des aktuellen Prozesses werden durch das neue Programm überschrieben.

2. Fork() erstellt einen neuen Prozess und generiert eine neue PID, sodass der untergeordnete Prozess eine eigene Prozess-ID hat. exec startet ein neues Programm und ersetzt den ursprünglichen Prozess, sodass das neue Programm die ID des Prozesses, der exec () aufruft, unverändert lässt, dh die PID des von exec ausgeführten neuen Prozesses ändert sich nicht und ist dieselbe wie die des Prozesses Aufruf der Exec-Funktion.

3. Die vom übergeordneten Prozess vor fork() geöffneten Dateideskriptoren werden auch im untergeordneten Prozess geöffnet und verweisen auf denselben Dateitabelleneintrag. Deskriptoren, die vor dem Aufruf von exec() geöffnet wurden, werden jedoch weiterhin geöffnet.

Empfohlene verwandte Video-Tutorials: „

C-Sprach-Tutorial

Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Lernen aller hilfreich sein wird. Weitere spannende Inhalte finden Sie in den entsprechenden Tutorial-Kolumnen auf der chinesischen PHP-Website! ! !

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen fork() und exec() in C? Ein einfacher Vergleich zwischen fork() und exec(). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn