1、分析理解多个进程的创建
1)若一个程序中有这样的代码,则有几个进程,父子关系如何?
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void){
pid_t pid,pid2;
char *message;
int x;
pid = fork();
pid2 = fork();
if (pid < 0)
{ perror("fork failed");
exit(1); }
补充完整后面的代码,使多个进程输出各自身份,并符合正确的亲缘关系
if ( )
{ message = "This is the child\n";
x = 0; }
……
printf("%s I'm %d, x=%d,my father is:%d\n",message,x,getpid(),getppid());
return 0;
}//main
给出代码及执行效果抓图,并要有说明分析!!!!谁先谁后,为什么。
文件名是fork.c
运行fork.c文件,发现父类进程先运行x=11569是x=11570的父亲进程,x=11569的父亲进程是11086,子进程输出my father=1,是因为父亲进程运行完就结束了,父进程关系着子进程pcb内存的回收,所以系统变为孤儿进程。找父进程的祖进程来帮助子进程的运行实现。X=11571和x=11572都是一个孤儿进程,将祖进程拉来帮助子进程的运行。
补充代码如下:
if (pid==0 )
{ message = "This is the child\n";
x = 0; }// 孩子进程
else
{ message="This is the parent\n";
x=10;
sleep(2); }//父亲进程
2)若有如下的代码
for(i = 0; i <4; i++)
{
pid = fork();
……
请分析将产生多少个进程?要有说明分析!!!!
Folk4.c
文件名是fork4.c
[hadoop@hadoop100 ~]$ ./myfolk
This is the child
I'm 0, x=12521,my father is:12520
This is the child
I'm 0, x=12522,my father is:12520
This is the child
I'm 0, x=12523,my father is:12520
This is the child
I'm 0, x=12524,my father is:12520
This is the parent
I'm 10, x=12520,my father is:11086
每次调用fork函数,系统会复制原程序;每一次循环后,进程的总数是当前进程数量的两倍;
4次循环后,进程实际的数量为2^4个,创建了4个子进程,这4个子进程与父进程共同竞争资源,5个进程使用CPU的顺序不定,父进程在子进程尚未全部终止前就终止了。
2、解释执行效果
若有下面的功能代码,执行会有怎样的输出?不只有抓图,要有说明分析!!!!谁先谁后,哪里停顿过。
int main(void){
pid_t a;
a = fork();
if (a == 0) {
sleep(2);
execlp ("ps" ,"ps",NULL);
printf("%s I'm %d, x=%d,my father is:%d\n",message,getpid(),getppid());
}
else
printf("%s I'm %d, x=%d,my father is:%d\n",message,getpid(),getppid());
return 0;
}
解:文件名是fork_a.c,添加头文件
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
子进程睡了一会儿,所以父进程先输出,调用execlp函数ps中的内容覆盖子进程,输出ps的内容,子进程中原来的内容不再输出。
父进程比子进程先创建,为了输出正确的进程间的亲子关系,加入sleep(2)语句人工干预执行顺序,让它晚于子进程结束。
3. 体验进程/线程的顺序控制。(基于对例5-9,5-11的理解,注意不是用sleep控制)
1)编写一个可产生父子进程的程序,使执行时子进程先printf输出内容,然后父进程再printf输出。
2)编写一个可产生两个线程(一个输出AAAAAA,一个输出BBBBBB)的程序,代码中要求控制线程的输出为AAAAAABBBBBB的顺序。然后修改控制代码,重新编译执行,得到另一种输出顺序,得到BBBBBBAAAAAA的输出。
修改后的文件名是fork3_2_1.c,内容与图片上一样。