赞
踩
1、在父进程中执行fork()函数时,父进程会复制出一个子进程
2、父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行
3、父子进程分别获得其所属fork()的返回值,fork()在父进程中返回子进程ID,在子进程中返回0
4、通过判断返回值来判定是父进程还是子进程,从而执行相应的动作
每个进程都对应一个进程号称做pid,pid用于标识进程,其实就是一个整数;由于每个进程的产生都来自它的父进程,所以也有对应的父进程号称做ppid(parent process ID)。
使用linux内核提供的fork()函数可以创建出一个子进程,子进程返回0,父进程返回子进程的id,出错则返回-1。
类型 | 说明 |
---|---|
所需头文件 | #include <unistd.h> |
函数原型 | pid_t fork(void) |
返回值 | 0:表示子进程 。大于0:表示父进程。-1:表示出错 |
说明:fork()的返回值类型pid_t是一个宏,其实就是一个整数,如果要使用pid_t这个类型,要加头文件#include <sys/types.h> ,本案例中直接定义整数代替,是一样的。
getpid():获取此进程ID
getppid():获取父进程ID
fork.c
#include <stdio.h> #include <unistd.h> /** *功能:创建一个进程 *作者:Maker&xiong *时间:2020.4.13 */ int main(){ int pid = fork(); if(pid == -1){ printf("出错了\n"); }else if(pid == 0){//子进程 printf("我是子进程 pid:%d,ppid::%d\n",getpid(),getppid()); }else{//父进程 sleep(1);//让父进程睡1秒,避免子进程还没创建父进程就结束了 printf("我是父进程 pid:%d,ppid::%d\n",getpid(),getppid()); } return 0; }
运行结果:
进程模型:
当运行fork.c文件的时候,刚开始这个程序产生的进程pid为5744,当执行到fork()函数的时候,产生一个它的子进程,pid为5745。而进程5744的父进程就是执行fork.c程序的终端进程。为了验证结果,我们可以在父进程中写一个死循环,不让程序终止。
printf("我是父进程 pid:%d,ppid::%d\n",getpid(),getppid());
for( ; ; );//放一个死循环用于验证结果
执行程序后,再开启一个终端,输入命令查看进程id:
ps -ef|grep a.out
可以看到a.out文件的进程id为5744,在它之下有个子进程5745,<defunct>表示该子进程已经执行完毕,是个僵尸进程。而a.out的父进程id为2668,输入命令查看2668的进程,可以看到2668进程是bash,也就是终端,在终端进程产了一个a.out这个子进程,id为5744。结果验证完毕。
1、fork()创建进程时,子进程会将父进程几乎所有内容复制过来,子进程独有的只有它的进程号、资源使用和计时器等
2、因为子进程几乎是父进程的安全复制,所以父子进程会运行同一个程序。因此需要用一种方式区分它们,并使他们照此运次,否则,这两个进程不可能做不同的事。(即使用if…else等方式区分)
3、fork()在父子进程中的返回值是不一样的,父进程返回子进程ID,子进程返回0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。