资源描述:
《linux创建进程》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、fork,vfork,clone都是linux的系统调用,用来创建子进程的(确切说vfork创造岀来的是线程)。先介绍下进程必须的4要点:a.要柯一段程序供该进程运行,就像一场戏剧要科一个剧木一样。该程序是可以被多个进程共享的,多场戏剧用一个剧本一样。b.奋起码的私奋财产,就足进程专川的系统堆栈空间。(:膚“户丨I”,既揀作系统所说的进程校制块,在linux屮具体实现是task_structd.有独立的存储空间。当一个进程缺少d条件吋候,我们称其为线程。1.fork创造的子进程复制了父亲进程的资源,包拈内存的内界t
2、ask_struct内矜(2个进程的pid不同)。这里是资源的复制不是指针的复制。下逝的例子可以看出[root@liumengliprogram]#cattestFork.c#include',stdio.h,'intmain(){intcount=1;intchild;if(!(child=fork())){//开始创建子进程printf(”Thisisson,hiscountis:%d.andhispidis:%d",++count,getpid());//子进程的内界}else{printf(HThisi
3、sfather,hiscountis:%d,hispidis:%d",count,getpid());}}[root@liumengliprogram]#gcctestFork.c-otestFork[root@liumengliprogram]#./testForkThisisson,hiscountis:2.andhispidis:3019Thisisfather,hiscountis:1,hispidis:3018[root@liumengliprogram]#从代码里面可以看出2者的pid不内存资源co
4、unt是值得复制,子进程改变了count的伉,而父进程中的count没有被改变。有人认为这样大批量的复制会导致执行效率过低。其实在复制过程屮,子进程复制了父进程的task_struct,系统堆栈空M和页血表,这意味着上面的程序,我们没有执行count++前,M:实了进程和父进程的count指h'd的是同一块内存。而当子进程改变了父进程的变量吋候,会通过copy_on_write的手段为所涉及的贝面建立一个新的副本。所以当我们执行++count后,这吋候子进积才新建了一个页面复制原來页面的内界,基木资源的复制是必须的
5、,而目.是高效的。整体看上去就像是父进程的独立存储空闽也S制了一遍。其次,我们看到子进程和父进程直接没有互相干扰,明姑2者资源都独立了。我们看下面程序[root@liumengliprogram]#cattestFork.c#include"stdio.h"intmain(){intcount=1;intchild;if(!(child=fork())){inti;for(i=0;i<200;i++){printf(”Thisisson,hiscountis:%d.andhispidis:%d",i,getpi
6、d());}}else{printf(”Thisisfather,hiscountis:%d,hispidis:%d",count,getpid());}}[root@liumengliprogram]#gcctestFork.c-otestFork[root@liumengliprogram]#./testFork•••Thisisson,hiscountis:46.andhispidis:4092Thisisson,hiscountis:47.andhispidis:4092Thisisson,hiscou
7、ntis:48.andhispidis:4092Thisisson,hiscountis:49.andhispidis:4092Thisisson,hiscountis:50.andhispidis:4092Thisisfather,hiscountis:1,hispidis:4091[root@liumengliprogram]#Thisisson,hiscountis:51.andhispidis:4092Thisisson,hiscountis:52.andhispidis:4092•••(运气很衰,非要20
8、0多个j有效果,郁闷)从结果可以看ill父子2个进程是M步运行的。这和下面的vfork有区别。2.vfork创建出来的不是真正意义上的进程,而是一个线程,因为它缺少了我们上而提到的进程的四要素的笫4项,独立的内存资源,看下面的程序[root@liumengliprogram]#cattestVfork.cinclude"stdio.h"intmain(){i