Linux进程的创建

本文主要通过自身实践,介绍了在Linux下进行进程创建的简单实例。


进程的一生

  • 随着一句fork,一个新进程呱呱落地,但它这时只是老进程的一个克隆。
  • 然后随着exec,新进程脱胎换骨,离家独立,开始了为人民服务的职业生涯。
  • 人有生老病死,进程也一样:

        –自然死亡,即运行到main函数的最后一个“}”,从容地离我们而去。
        –自杀(自杀有2种方式)
          • 调用exit函数;
          • 在main函数内使用return;
无论哪一种方式,它都可以留下遗书,放在返回值里保留下来。
–被谋杀,被其它进程通过另外一些方式结束他的生命。

  • 进程死掉以后,会留下一具僵尸,wait充当了殓尸工,把僵尸推去火化,使其最终归于无形。


环境

本文为Ubuntu 14.04版本,64位系统。

内核版本4.1.38。


任务

-分别用fork、vfork创建进程

  fork()
–复制全部资源
–clone(SIGCHLD, 0)

  vfork()
–复制除task_struct和系统堆栈之外的资源(产生的是线程)
–clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0)

-显示进程的相关信息并解释

-从当前进程找到init的路线(进程号)


进程创建

一、创建process_create1.c文件,使用fork函数编写程序:


创建进程,并输出进程的相关信息:



创建process_create2.c文件,使用vfork函数编写程序:


创建进程,并输出进程的相关信息:



在使用vfork函数的过程中,如果在子进程中不使用exit()函数进行退出或者使用了return()

函数进行退出,会出现一样的结果:


两种情况均会出现错误的提示:


这是由于fork和vfork存在着区别。使用fork时,子进程和父进程的调度顺序是由调度器决定,而

使用vfork时,子进程使用exit()结束后才调用父进程。如果使用return(),会使程序返回到

程序被调用处,掉入到无限循环的结果。


fork与vfork的区别

1. fork要拷贝父进程的数据段;而vfork则不需要完全拷贝父进程的数据段,在子进程没有调用exec和exit之前,

子进程与父进程共享数据段

2. fork不对父子进程的执行次序进行任何限制;而在vfork调用中,子进程先运行,父进程挂起,直到子进程调用

了exec或exit之后,父子进程的执行次序才不再有限制


从当前进程找到init的路线(进程号)

使用ps命令,找到当前的进程及进程号信息。以下为bash进程为例。

使用ps -ef|grep [当前进程号] 命令,显示信息中的第三列为父进程的PID。

依次追溯,直到找到进程号为1的init进程。



依次按父进程号进行追溯:



由上面过程,选择的是当前的bash进程,回到init进程路线为

2585-> 2580 -> 1326 -> 1310 -> 876 -> 1


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值