Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Dalam bahasa C, apakah perbezaan antara fork() dan exec()?

Dalam bahasa C, apakah perbezaan antara fork() dan exec()?

王林
王林ke hadapan
2023-09-13 11:01:021441semak imbas

Dalam bahasa C, apakah perbezaan antara fork() dan exec()?

Di sini, kita akan melihat kesan panggilan sistem fork() dan exec() dalam bahasa C. fork digunakan untuk mencipta proses baharu dengan menyalin proses panggilan. Proses baru adalah proses kanak-kanak. Sila rujuk hartanah berikut.

  • Proses anak mempunyai ID proses uniknya sendiri.
  • ID proses ibu bapa proses anak adalah sama dengan ID proses proses panggilan.
  • Proses anak tidak mewarisi kunci ingatan dan semafor proses ibu bapa.

fork() mengembalikan PID proses anak. Jika nilainya bukan sifar, ia adalah ID proses induk, jika nilainya 0, ia ialah ID proses anak.

Panggilan sistem exec() digunakan untuk menggantikan imej proses semasa dengan imej proses baharu. Ia memuatkan atur cara ke dalam ruang semasa dan menjalankannya dari titik masuk.

Jadi, perbezaan utama antara fork() dan exec() ialah fork() memulakan salinan baharu proses yang sama dengan proses utama. exec() menggantikan imej proses semasa dengan imej proses baharu, dan proses induk dan proses anak dilaksanakan pada masa yang sama.

Contoh

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>
int main() {
   pid_t process_id;
   int return_val = 1;
   int state;
   process_id = fork();
   if (process_id == -1) { //when process id is negative, there is an error, unable to fork
      printf("can&#39;t fork, error occured</p><p>");
         exit(EXIT_FAILURE);
   } else if (process_id == 0) { //the child process is created
      printf("The child process is (%u)</p><p>",getpid());
         char * argv_list[] = {"ls","-lart","/home",NULL};
      execv("ls",argv_list); // the execv() only return if error occured.
      exit(0);
   } else { //for the parent process
      printf("The parent process is (%u)</p><p>",getppid());
      if (waitpid(process_id, &state, 0) > 0) { //wait untill the process change its state
         if (WIFEXITED(state) && !WEXITSTATUS(state))
            printf("program is executed successfully</p><p>");
         else if (WIFEXITED(state) && WEXITSTATUS(state)) {
            if (WEXITSTATUS(state) == 127) {
               printf("Execution failed</p><p>");
            } else
               printf("program terminated with non-zero status</p><p>");
         } else
            printf("program didn&#39;t terminate normally</p><p>");
      }
      else {
         printf("waitpid() function failed</p><p>");
      }
      exit(0);
   }
   return 0;
}

Output

The parent process is (8627)
The child process is (8756)
program is executed successfully

Atas ialah kandungan terperinci Dalam bahasa C, apakah perbezaan antara fork() dan exec()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Bom C lwn BASH Fork?Artikel seterusnya:Bom C lwn BASH Fork?