fork()
函数是一个系统调用,用于创建一个新的进程。它没有参数,原型如下:
#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);
该函数在成功创建子进程时,在父进程中返回子进程的进程ID,在子进程中返回0。而在失败时,返回一个负值。
pid_t
是一个整数类型,用于表示进程ID。在头文件 <sys/types.h>
中定义。
使用 fork()
函数后,父进程和子进程都会继续执行接下来的代码,但是它们各自有不同的进程ID。
当调用 fork()
函数创建子进程时,操作系统会为子进程分配一个与父进程相同的地址空间,并且将父进程的整个地址空间复制到子进程中。这意味着子进程在创建时会完全拥有与父进程相同的内存布局和内容。
但是,在创建子进程后,子进程和父进程会独立执行,它们可以独立地修改各自的地址空间中的内容。这是因为操作系统采用了写时复制(Copy-on-Write)技术,只有在需要修改共享内存页时才会真正进行复制。这样可以节省内存,并提高创建子进程的效率。
请注意,子进程获得的是父进程的副本,而不是引用。因此,对于父子进程之间的数据修改不会相互影响。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t pid;
pid = fork(); // 创建子进程
if (pid < 0) {
// 创建进程失败
fprintf(stderr, "Fork failed\n");
return 1;
}
else if (pid == 0) {
// 子进程代码
printf("This is the child process\n");
// 子进程执行其他操作...
}
else {
// 父进程代码
printf("This is the parent process\n");
// 父进程执行其他操作...
}
return 0;
}
在调用 fork()
函数后,操作系统会创建一个新的子进程。而子进程的执行与父进程是并发的,具体谁先执行并没有确定的规则。
根据操作系统的调度算法和当前系统的负载情况,子进程和父进程可能会以任意顺序或几乎同时开始执行。这种情况下,我们无法预测哪个进程会先执行。