概述
最近做了一次实验:
1.编写一段程序,利用系统调用fork()函数创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符串,其中,每个进程显示其pid值,及其父进程的pid值。(getpid返回当前进程标识,getppid返回父进程标识。)类似如下显示:父进程显示’"我是爸爸.pid:…爸爸的爸爸是ppid:… ",子进程分别显示’"我是大儿子.pid:…, 我的爸爸是ppid:… "和’“我是小女儿.pid:…, 我的爸爸是ppid:…”。试观察并分析屏幕上的显示结果。
2. 运行终端,在执行程序之前执行命令“ps -af”,执行程序之后,通过在多进程执行过程中执行命令“ps -af”,显示当前进程状态。试观察并分析屏幕上的显示结果。
接下来阿伟将给大家详细讲解,大家注意听哦:
一、我们先来了解什么是fork()函数:
一个进程包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,即两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同,相当于克隆了一个自己。
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。
问:为什么fork会返回两次?
答:在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。
二、代码实现
代码1:
#include <stdio.h> #include<unistd.h> int main(){ int pid; pid=fork(); int i = 0; for(i=0;i<2;i++){ if(pid==0){ printf("我是大儿子,我的pid是 %d.n",getpid()); }else if(pid>0){ printf("我是父亲 ,我的pid是 %d.n",getpid()); pid=fork(); if(pid==0){ printf("我是小女儿,我的pid是 %d.n",getpid()); }else if(pid>0){ printf("我是父亲,我的pid是 %d.n",getpid()); }else{ printf("fork() error.n"); } }else{ printf("fork() error.n"); } } return 0; }
结果截图:
代码2:#include <unistd.h> #include <stdio.h> int main(void) { pid_t fpid; //fpid表示fork函数返回的值 printf("hellon"); fpid=fork(); if (fpid<0){ printf("error in fork!"); } else if (fpid==0){ while(1){ printf("我是大儿子%d,我爸爸是%d.n",getpid(),getppid()); sleep(1); } }else{ fpid=fork(); if (fpid<0){ printf("error in fork!"); } else if (fpid==0){ while(1){ printf("我是小女儿%d,我爸爸是%d.n",getpid(),getppid()); sleep(2); } }else{ while(1){ printf("我是爸爸%d,爸爸的爸爸是%d.n",getpid(),getppid()); sleep(3); } } } return 0; }
结果截图
**三、分析与总结** 从进程并发执行来看,上面的三个进程没有同步措施, 只要进程就绪就可能执行,因此各种执行顺序都有可能, 所以三个进程的输出次序带有随机性。并且,每当一个进程执 行了一段时间,其它就绪进程可能抢占处理机,因此,多个进程可能交错执行。 不过,操作系统实现函数printf( )时,保证了进程每次调用该函数输出一个字符串时不会被中断。 本次实验虽然有些难度,但大家不要灰心,仔细想想问题还是能够得到解决的(把fork()函数放入父进程即可实现),加油鸭。
最后
以上就是激动小刺猬为你收集整理的#Linux#folk()函数的全部内容,希望文章能够帮你解决#Linux#folk()函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复