|
多进程编程 |
实验名称:多进程编程 实验目的:理解多进程的概念和编程方法 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 |
#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 命令观察 |
转载于:https://blog.51cto.com/wolfword/1240337