博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux fork()创建进程
阅读量:3935 次
发布时间:2019-05-23

本文共 1598 字,大约阅读时间需要 5 分钟。

进程创建过程

1、在父进程中执行fork()函数时,父进程会复制出一个子进程

2、父子进程的代码从fork()函数的返回开始分别在两个地址空间中同时运行
3、父子进程分别获得其所属fork()的返回值,fork()在父进程中返回子进程ID,在子进程中返回0
4、通过判断返回值来判定是父进程还是子进程,从而执行相应的动作
fork()函数的使用

每个进程都对应一个进程号称做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;

}

1234567891011121314151617181920212223

运行结果:

运行结果
进程模型:
终端进程2268___
父进程5744___
子进程5745__.

当运行fork.c文件的时候,刚开始这个程序产生的进程pid为5744,当执行到fork()函数的时候,产生一个它的子进程,pid为5745。而进程5744的父进程就是执行fork.c程序的终端进程。为了验证结果,我们可以在父进程中写一个死循环,不让程序终止。

printf(“我是父进程 pid:%d,ppid::%d\n”,getpid(),getppid());

for( ; ; );//放一个死循环用于验证结果

12

执行程序后,再开启一个终端,输入命令查看进程id:

ps -ef|grep a.out

1

可以看到a.out文件的进程id为5744,在它之下有个子进程5745,表示该子进程已经执行完毕,是个僵尸进程。而a.out的父进程id为2668,输入命令查看2668的进程,可以看到2668进程是bash,也就是终端,在终端进程产了一个a.out这个子进程,id为5744。结果验证完毕。

在这里插入图片描述
总结

1、fork()创建进程时,子进程会将父进程几乎所有内容复制过来,子进程独有的只有它的进程号、资源使用和计时器等

2、因为子进程几乎是父进程的安全复制,所以父子进程会运行同一个程序。因此需要用一种方式区分它们,并使他们照此运次,否则,这两个进程不可能做不同的事。(即使用if…else等方式区分)
3、fork()在父子进程中的返回值是不一样的,父进程返回子进程ID,子进程返回0

转载地址:http://fbegn.baihongyu.com/

你可能感兴趣的文章
spring 嵌套事务
查看>>
Linux 查看CPU信息,机器型号,内存等信息
查看>>
webSocket-Java开发总结
查看>>
ELK原理与介绍(转)
查看>>
Ubuntu中支持yum命令(转)
查看>>
ubuntu navicat安装,破解使用;以及设置系统启动自动执行脚本(转)
查看>>
Ubuntu16.04.1 安装Nginx
查看>>
Terminator:多终端 工具
查看>>
deepin安装mysql/navicat,生成桌面快捷方式
查看>>
国外程序员整理的系统管理员资源大全 (转)
查看>>
Graylog2+rsyslog+log4j 全过程日志管理环境搭建(转)
查看>>
Elasticsearch6.0 使用Sense发送请求Content-Type报错(转)
查看>>
基于Elasticsearch搜索平台设计(转)
查看>>
用Elasticsearch构建电商搜索平台,一个极有代表性的基础技术架构和算法实践案例(转)
查看>>
使用 Binlog 和 Canal 从 MySQL 抽取数据(转)
查看>>
谈谈对Canal( 增量数据订阅与消费 )的理解(转)
查看>>
Canal数据库同步组件(转)
查看>>
ElasticSearch + Canal 开发千万级的实时搜索系统(转)
查看>>
ElasticSearch + Canal搭建搜索系统(整理中)
查看>>
Centos系统安装MySQL(整理)
查看>>