spacer.gif实验1

多进程编程

实验名称:多进程编程

实验目的:理解多进程的概念和编程方法

1 掌握一个数据类型pid_t 进程标识

2 掌握两个函数:getpid(),getppid(),前者是获得自己的进程号,后者是获得父进程

的进程号

3 掌握fork()函数的功能,理解在程序设计中如何使用fork()的返回值来控制哪些代码

4

父进程应该执行的,哪些是子进程应该执行的。

程序1 多进程编程基础

//fork1.c

#include <stdio.h>

#include <sys/types.h>

#include <unistd.h>

int main()

{

pid_t child_pid;

printf("本进程进程号是%d\n",getpid());

child_pid=fork();

if(child_pid!=0)

{

//利用fork  的返回值来规定那些代码父进程可以执行,那些子进程可以执行

printf("我是父进程,进程号是%d, child_pid=%d\n  ",getpid(),child_pid);

}

else

{

//子进程可以执行的

printf("我是子进程,进程号是%d, child_pid=%d\n  ",getpid(),child_pid);

}

return 0;

}

程序2

主进程,创建4 个子进程,这4 个子进程分别打印100 ’A’100 ’B’,100 ’C’

100 ’D’

请自己完成该实验

程序3 僵尸进程fork3.c


spacer.gif#include <stdlib.h>

#include <sys/types.h>

#include <unistd.h>

int main()

{

pid_t x;

x=fork();

if(x>0)

sleep(60);

else

exit(0);

return 0;

}.

编译并且运行

输入命令

ps –a –o pid  ,ppid ,command

观察<defunct>

原因分析:

UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他,

那么他将变成一个僵尸进程。通过ps 命令查看其带有defunct 的标志。僵尸进程是一个早已

死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)

但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程。因为每个进

程结束的时候,系统都会扫描当前系统中所运行的所有进程,看看有没有哪个进程是刚刚结

束的这个进程的子进程,如果是的话,就由Init 进程来接管他,成为他的父进程,从而保证

每个进程都会有一个父进程。Init 进程会自动wait 其子进程,而因此被Init 接管的所有进程

都不会变成僵尸进程。

程序4 fork4.c

如果一个进程通过fork,产生了一个子进程,这个子进程又通过fork  产生一个孙进程,然

后子进程很快结束,这时候孙进程的父进程就退出系统了,因此孙进程就将init 进程作为父

进程

要求,编写一个这样的程序,并且通过pstree 命令显示该孙进程的父进程。

请完成该程序并且用pstree 命令观察