函数作用:fork() 函数多进程编程的基础,用于新建子进程。子进程拥有自己的虚拟地址空间,并且子进程是父进程的一个副本,拥有和父进程一样的程序代码、数据、堆栈等等。父子进程之间唯一的区别在于它们拥有不同的 PID。
函数逻辑:fork() 函数被调用之后,程序会立即被分成父子两个进程,并且并行运行。所以,fork() 会特殊的返回 2 次,程序需要通过 if/else 语句来判断 2 个不同的 pid 数值,以此判断当前代码运行在父进程地址空间还是子进程地址空间。
函数原型:
#include pid_t fork(void);
示例代码:通过 pid 数值判断,在 if/else 代码块中实现父子进程各自的逻辑。
#include
#include
#include int main() {pid_t pid;int status;pid = fork();if (pid == 0) {// 子进程中执行 ls 命令execlp("ls", "ls", "-l", NULL);printf("exec failed\n");} else if (pid > 0) {// 父进程中等待子进程结束wait(&status);printf("child process exited with status %d\n", status);} else {printf("fork failed\n");}return 0;
}
在 Linux 中使用 pipe 或 “FIFO 文件“ 等基于 fd(文件描述符)的 IPC 机制会有很多局限性,比如效率的问题。而共享内存 IPC 是一种基于内存访问的方式,有效率高、实现简单的优势。
Linux 提供了多种共享内存 IPC 方案,可有效减少数据拷贝的次数:
