Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ความแตกต่างระหว่าง fork() และ exec() ใน C


ผลของ fork() และ exec() system call ใน C fork() สร้าง process ใหม่โดย duplicate calling process process ใหม่คือ child process

  • Child process มี process id unik
  • Parent process id ของ child เหมือน process id ของ caller
  • Child ไม่สืบทอด memory lock และ semaphores ของ parent

fork() คืนค่า PID ของ child ถ้า non-zero คือ parent PID ถ้า 0 คือ child PID

exec() แทนที่ current process image ด้วยใหม่ โหลดโปรแกรมเข้า current space รันจาก entry point

ความแตกต่างหลัก: fork เริ่ม process ใหม่ copy ของ main process exec แทนที่ current process image ด้วยใหม่ ทั้ง parent และ child รันพร้อมกัน

ตัวอย่าง

#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) { printf("can't fork, error occured\n"); exit(EXIT_FAILURE); } else if(process_id == 0) { printf("The child process is (%u)\n", getpid()); char *argv_list[] = {"ls", "-lart", "/home", NULL}; execv("ls", argv_list); exit(0); } else { printf("The parent process is (%u)\n", getppid()); if(waitpid(process_id, &state, 0) > 0) { 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; }

ผลลัพธ์

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