Computer >> Máy Tính >  >> Lập trình >> lập trình C

Sự khác biệt giữa fork () và execute () trong C

Ở đây chúng ta sẽ thấy tác dụng của lệnh gọi hệ thống fork () và execute () trong C. fork được sử dụng để tạo một quá trình mới bằng cách nhân bản quá trình gọi. Tiến trình mới là tiến trình con. Xem thuộc tính sau.

  • Quy trình con có id quy trình duy nhất của riêng nó.
  • Id quy trình mẹ của quy trình con giống với id quy trình của quy trình gọi.
  • Tiến trình con không kế thừa khóa bộ nhớ của cha mẹ và các semaphores.

Fork () trả về PID của tiến trình con. Nếu giá trị khác 0 thì đó là id của quy trình mẹ và nếu giá trị này là 0 thì đây là id của quy trình con.

Lệnh gọi hệ thống thực thi () được sử dụng để thay thế hình ảnh quy trình hiện tại bằng hình ảnh quy trình mới. Nó tải chương trình vào không gian hiện tại và chạy chương trình từ điểm nhập.

Vì vậy, sự khác biệt chính giữa fork () và execute () là fork bắt đầu quy trình mới là bản sao của quy trình chính. execute () thay thế hình ảnh quy trình hiện tại bằng hình ảnh mới. Cả hai quy trình mẹ và con đều được thực thi đồng thời.

Ví dụ

#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't fork, error occured\n");
         exit(EXIT_FAILURE);
   } else if (process_id == 0) { //the child process is created
      printf("The child process is (%u)\n",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)\n",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\n");
         else if (WIFEXITED(state) && WEXITSTATUS(state)) {
            if (WEXITSTATUS(state) == 127) {
               printf("Execution failed\n");
            } else
               printf("program terminated with non-zero status\n");
         } else
            printf("program didn't terminate normally\n");
      }
      else {
         printf("waitpid() function failed\n");
      }
      exit(0);
   }
   return 0;
}

Đầu ra

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