红联Linux门户
Linux帮助

Linux进程的创建

发布时间:2017-04-12 09:55:08来源: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函数编写程序:
Linux进程的创建
创建进程,并输出进程的相关信息:
Linux进程的创建
创建process_create2.c文件,使用vfork函数编写程序:
Linux进程的创建
创建进程,并输出进程的相关信息:
Linux进程的创建
在使用vfork函数的过程中,如果在子进程中不使用exit()函数进行退出或者使用了return()函数进行退出,会出现一样的结果:
Linux进程的创建
两种情况均会出现错误的提示:
Linux进程的创建
这是由于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进程。
Linux进程的创建
依次按父进程号进行追溯:
Linux进程的创建
由上面过程,选择的是当前的bash进程,回到init进程路线为
2585-> 2580 -> 1326 -> 1310 -> 876 -> 1
 
本文永久更新地址:http://www.linuxdiyf.com/linux/29932.html