实验三:Linux 进程管理
一、 实验目的
(1) 通过对 Linux 进程控制的相关系统调用的编程应用,进一步加深对进程概
念的理解,明确进程和程序的联系和区别,理解进程并发执行的具体含义。
(2) 通过 Linux 管道通信机制、消息队列通信机制、共享内存通信机制的应用,
加深对不同类型的进程通信方式的理解。
(3) 通过对 Linux 的 Posix 信号量及 IPC 信号量的应用,加深对信号量同步机
制的理解。
(4) 请根据自身情况,进一步阅读分析相关系统调用的内核源码实现。
二、 实验过程
1) 实现一个模拟的 shell
首先创建三个.c 程序:cmd1.c,cmd2.c,cmd3.c。其功能分别是打印自己
的名字。接着创建主程序 test1.c,读取键盘输入的指令。利用 fork()函数创建
子进程,在子进程中调用 exec 函数族中的 execve 函数:
int execve(const char * path , char *const argv[] , char *const
envp[])根据先前输入的键盘指令,执行对应的.c 程序。
2) 实现一个管道通道程序
在程序的一开始先进行必要的初始化操作,如创建适用于进程间同步或互斥
的有名信号量(写的信号量 w 初值置 1、写者数量的信号量 writercount 初值置
0)、创建管道等。
定义三个 pid_t 变量 pid1、pid2、pid3,并赋初值 1。用 fork()创建子进
程 1,并将其返回值赋给 pid1。利用 pid1 的返回值判断此时执行的是父进程还
是子进程。若是父进程即 pid1>0,则用 fork()创建子进程 2,并将其返回值赋
给 pid2。通过 pid1 和 pid2 的返回值判断此时执行的是哪一个进程,若是父进
程即 pid1>0&&pid2>0,则用 fork()创建子进程 3,并将其返回值赋给 pid3。至
此三个子进程创建完毕。
当子进程 1 运行即 pid1==0 时,申请写的信号量 w,关闭读的管道,读取键