fork函数是Unix和类Unix操作系统中的一个重要概念,是创建新进程的一种方法。该函数会创建一个新进程,它是被调用进程(父进程)的复制。新进程(子进程)从fork返回处开始执行,它与父进程几乎完全相同,但有自己独特的进程ID,不同的内存空间和不同的文件描述符。
fork函数会将父进程的代码、数据、堆栈、文件描述符和信号处理程序复制到子进程中,但子进程拥有自己独特的内存地址空间,不与父进程共享内存或文件。
fork函数调用一次,但会返回两次。对于父进程,fork函数返回子进程ID;而对子进程,返回值为0。这是由于新进程中执行的继续从fork的返回处开始,但是fork返回值不同。
在父进程中,fork返回的子进程ID是大于0的整数,而子进程内部返回的0不会影响到父进程的命令流程。因此,父进程可以根据子进程的PID号来判断进程的唯一性或开启新的进程。
为了更好地理解fork函数,下面为您演示一个简单的例子:
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
int main()
pid_t pid;
int i = 1;
pid = fork(); // 创建一个新进程
if(pid == 0){ // 子进程
printf("这是子进程,i = %d, pid = %d, ppid = %d\n", ++i, getpid(), getppid());
}else if(pid > 0){ // 父进程
printf("这是父进程,i = %d, pid = %d, childPid = %d\n", i, getpid(), pid);
}else{ // 创建失败
printf("创建子进程失败!\n");
exit(1);
}
return 0;
}
运行该程序,会发现它输出了两行信息,分别是父进程和子进程的pid和ppid。
在使用fork函数时,需注意以下几点: