1、相关函数
#include<unistd.h>
#include<sys/types.h>
pid_t fork(void);
返回:子进程中为0,父进程中为子进程ID,出错为-1pid_t vfork(void);
返回:子进程中为0,父进程中为子进程ID,出错为-1
- fork创建的新进程被称为子进程,该函数调用一次,但返回两次。两次返回的区别是:在子进程中返回值是0,而在父进程中的返回值则是新子进程的进程ID。
- 创建子进程,父子进程哪个先运行根据系统调试且复制父进程的内存空间。
- vfork创建子进程,但子进程先运行且不复制父进程的内存空间。
2、相关示例:
#include<unistd.h>
#include<sys/types.h>
#include<stdio.h>int main(void)
{pid_t pid;printf("start call fork\n");pid=fork(); //创建子进程//在fork之后会运行两个进程(父进程和子进程)if(pid<0){perror("fork error");}else if(pid>0)//父进程{//在父进程中fork返回的是子进程的pid//父进程执行的代码……printf("I am parent,pid : %d,ppid:%d,fork :%d\n",getpid(),getppid(),pid);}else//子进程{//在子进程进程中fork返回的是0//子进程执行的代码……printf("I am child,pid:%d,ppid:%d,fork:%d\n",getpid(),getppid(),pid);}return 0;
}
运行结果:
3、子进程与父进程的关系
- 子进程的继承属性
- 用户信息和权限、目录信息、信号信息、环境、共享存储段、资源限制、堆、栈和数据段,共享代码段
- 子进程特有属性
- 进程ID、锁信息、运行时间、未决信号
- 操作文件时的内核结构变化
- 子进程只继承父进程的文件描述表,不继承但共享文件表项和i-node。
- 父进程创建一个子进程后,文件表项中的引用计数器加1变成2,当父进程作close操作后,计数器减1,子进程还是可以使用文件表项,只有当计数器为0时才会释放文件表项。
查看指定进程的信息: ps -ef | grep 进程名字