linux中“fork()”是一個(gè)系統(tǒng)調(diào)用函數(shù),用于創(chuàng)建一個(gè)新的進(jìn)程,會(huì)創(chuàng)建當(dāng)前進(jìn)程的一個(gè)副本,稱為子進(jìn)程,子進(jìn)程與父進(jìn)程幾乎完全相同,包括代碼、數(shù)據(jù)以及打開的文件描述符等,其原型為“pid_t fork(void);”。
在Linux中,fork()是一個(gè)系統(tǒng)調(diào)用函數(shù),用于創(chuàng)建一個(gè)新的進(jìn)程。該函數(shù)會(huì)創(chuàng)建當(dāng)前進(jìn)程的一個(gè)副本,稱為子進(jìn)程。子進(jìn)程與父進(jìn)程幾乎完全相同,包括代碼、數(shù)據(jù)以及打開的文件描述符等。
fork()函數(shù)的原型如下:
#include <sys/types.h> #include <unistd.h> pid_t fork(void);
其中,pid_t是一個(gè)整數(shù)類型,用于表示進(jìn)程ID(PID)。fork()函數(shù)沒有參數(shù)。
fork()函數(shù)調(diào)用后會(huì)有兩個(gè)返回值:
- 在父進(jìn)程中,fork()返回子進(jìn)程的PID(子進(jìn)程的ID)。
- 在子進(jìn)程中,fork()返回0。
因此,可以通過判斷fork()的返回值來確定當(dāng)前代碼是在父進(jìn)程中執(zhí)行還是在子進(jìn)程中執(zhí)行。
下面是一個(gè)簡單的示例代碼,演示了fork()函數(shù)的基本用法:
#include <stdio.h> #include <unistd.h> int main() { pid_t pid = fork(); if (pid < 0) { fprintf(stderr, "Fork failed. "); return 1; } else if (pid == 0) { printf("This is the child process. PID: %d ", getpid()); } else { printf("This is the parent process. Child PID: %d ", pid); } return 0; }
在上述代碼中,我們調(diào)用了fork()函數(shù)并根據(jù)返回值判斷當(dāng)前是在父進(jìn)程還是子進(jìn)程。在父進(jìn)程中,我們打印子進(jìn)程的PID;在子進(jìn)程中,我們打印自己的PID。
需要注意的是,fork()函數(shù)會(huì)將父進(jìn)程的內(nèi)存完全復(fù)制給子進(jìn)程,包括堆、棧和全局變量等。因此,在fork()之后,父進(jìn)程與子進(jìn)程會(huì)分別執(zhí)行各自的代碼,互不干擾。