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

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

王林
Lepaskan: 2023-09-13 11:01:02
ke hadapan
1454 orang telah melayarinya

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;
}
Salin selepas log masuk

Output

The parent process is (8627)
The child process is (8756)
program is executed successfully
Salin selepas log masuk

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!

Label berkaitan:
sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan