实验二 进程/线程基本编程练习

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=%dmy father is:%d\n",message,getpid(),getppid());

}

else

    printf("%s I'm %d, x=%dmy 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,内容与图片上一样。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值