目录
进程创建相关的函数
Linux中进程ID为pid_t类型,其实本质就是一个正整数,通过ps aux命令可以得到验证。pid为1的进程是Linux系统中创建的第一个进程。
获取当前进程的进程ID(PID)
#include <sys/types.h> #include <unistd.h> pid_t getpid(void);
获取当前进程的父进程ID(PPID)
#include <sys/types.h> #include <unistd.h> pid_t getppid(void);
创建一个新的进程
#include <unistd.h> pid_t fork(void);
fork()剖析
fork()
是一个用于在 Unix 和类 Unix 操作系统上创建新进程的系统调用。在fork()
被调用时,它会创建一个当前进程的副本,这个副本称为子进程,而调用fork()
的进程称为父进程。以下是关于fork()
的一些剖析:调用格式
#include <unistd.h> pid_t fork(void);
- 返回值:在父进程中,
fork()
返回子进程的进程ID;在子进程中,返回0;如果出错,返回-1。创建子进程
当
fork()
被调用时,操作系统会复制父进程的地址空间、文件描述符等信息,创建一个全新的子进程。父进程和子进程之间的区别在于,fork()
返回的值不同。子进程与父进程
- 子进程的资源(如文件描述符、内存内容)是父进程的副本,但是它们在内存中拥有不同的地址空间。这意味着父进程和子进程之间的变量是相互独立的。
- 子进程会继承父进程的打开文件描述符,但是它们是独立的,关闭一个在父进程中打开的文件并不会影响子进程中的文件。
父子进程执行流
- 父进程和子进程同时开始执行
fork()
后的代码。它们的执行流是相互独立的。- 在父子进程中,
fork()
返回的值是不同的:在父进程中返回子进程的ID,在子进程中返回0。代码演示
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { // 在父进程中创建子进程 pid_t pid = fork(); printf("当前进程fork()的返回值: %d\n", pid); if (pid > 0) { // 父进程执行的逻辑 printf("我是父进程, pid = %d\n", getpid()); } else if (pid == 0) { // 子进程执行的逻辑 printf("我是子进程, pid = %d, 我爹是: %d\n", getpid(), getppid()); } else // pid == -1 { // 创建子进程失败了 } // 不加判断, 父子进程都会执行这个循环 for (int i = 0; i < 5; ++i) { printf("%d\n", i); } return 0; }