进程的创建
2016年11月27日星期日
实验内容:
进程的创建
编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。
源代码:
#include #include #include int main(){ printf("\\n梦想起航的地方:\\n"); pid_t fpid1,fpid2;/*fpid表示fork()函数的返回值*/ printf("得到父进程的ID:%d\\n",getpid()); printf("\\n开始调用fork函数:\\n如果调用成功应该会生成一个子进程1\\n返回值: 若成功调用一次则返回两个值,\\n子进程返回0,父进程返回子进程标记(ID);\\n否则,出错返回-1。\\n"); fpid1=fork(); fpid2=fork(); if(fpid1<0)exit(0); else if(fpid1>0) printf("\\n这个是父进程打印:a\\n"); else if(fpid1==0) printf("\\n这个是子进程1的打印:b\\n"); if(fpid2<0)exit(0); else if(fpid2>0) printf("\\n这个还是父进程'打印:a\\n"); else if(fpid2==0); printf("\\n这个是子进程2的打印:c\\n"); } 后来发现这个程序应该是生成了三个子进程,如下图所示: 应该是8个,为啥变成了10个?多的两个是怎么回事呢? 体会:感觉我站在对立的两面镜子中间,然后在不停地数到底有多少面镜子.因为我感觉这个进程的创建会无限循环以至于无法跳出来!到最后我也弄不清程序怎么运行了! 修订版: 分析上面的原因就是因为父进程创建了一个与父进程一模一样的子进程,也就是说子进程也会继续调用fork函数,再复制,本身的父进程也会再复制!如此循环,不知道什么是结果.所以解决的办法就是只让父进程去创建两个子进程,而子进程无法创建自己的子进程.就是需要利用这两个相同进程的唯一不同点,即:在子进程里这个fork这个函数是返回0的,而在父进程里面fork这个函数是返回子进程ID的! 更正方法是: 源代码: #include #include #include int main() { int i; { pid=fork(); 子进程或创建进程失败均退出,这里是关键所在,跳出循环 */ { break; } } if(pid==-1) { perror("fail to fork!\\n"); exit(1); } else if(pid==0) { 子进程%did=%d,打印%c,其对应的父进程 exit(0); } { 父进程id=%d,父进程打印 exit(0); } } 随机执行: 程序执行如下: 1.父进程里的fork调用,复制父进程生成一个副本即为子进程1 2.得到父进程与子进程1 3.随机执行这两个进程中的一个,(两个进程都是压在栈里) 4.假设(那么栈底下的就是父进程)执行的是子进程1,则fork返回值是0,则for循环中断!这是也是子进程不能创建自己的子子进程的一个重点!i=0,往下继续执行当前进程的后面的程序,打印当前子进程1的信息,并且按照要求打印出b。这个进程执行完毕后自动销毁! 5.弹出栈底的父进程,执行父进程,在父进程中fork返回值是子进程1的ID,这时候for循环继续,再次调用fork函数,复制当前的父进程,生成一个副本,即子进程2.在把父进程和子进程2随机压入栈中。 6.假设栈顶是父进程,执行父进程,此时的i=1已经不满足for循环要求了,所以继续往下执行当前进程的程序,当前是父进程,所以fork返回的是子进程的ID,即pid!=0。打印父进程信息。父进程执行完毕,进程销毁! 7.弹出栈底的子进程2,fork返回值是0,中断for循环!i=1。往下执行当前进程的程序,pid==0,所以打印子进程2,并且按照要求打印b。子进程销毁。 8.到此所有进程都应该销毁了! 参考:百度百科fork函数下载本文