linux开发——进程篇(二) fork()创建进程

进程创建过程

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;

}

运行结果:
运行结果
进程模型:

终端进程2268___
父进程5744___
子进程5745__.

当运行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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式Linux充电站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值