实验报告
(学生打印后提交)
实验名称: shell 编程
实验时间: 10 年 04 月 21 日
实验人员:(姓名)(学号)(年级)
实验目的:1.熟悉使用 Linux 下的软件开发工具,如 gcc
2.熟练使用man帮助手册
3.学习使用Linux的系统调用,对进程进行管 理和完成进程之间的通信(如用信号和管道 进
行进程间通信)
4.理解并发程序中的同步问题
实验环境: linux
实验步骤:
1. 用帐户 root 登录,密码 123456
2. 自己用学号建立目录,把源文件拷入目录中
3. 阅读关于 fork,exec,wait,exit,pipe 系统调用的 man 帮助手册
4. 编译程序 fork.c 并运行,观察结果,观察进程
5.编译程序 pipe.c 并运行,观察结果
6.阅读关于函数 sigaction,tcsetpgrp 和 setpgid 的 man 帮助手册
7.编译程序 signal.c 并运行,观察结果,观察进程
8.编译程序 process.c 并运行,观察结果,观察进程
9.写实验总结
实验陈述:
1、基础知识:
什么是系统调用:系统调用是 UNIX 操作系统核心提供给用户程序使用的操作系统服
务,系统调用主要提供用户程序对文件进行读写,进程的创建,删除和控制以及数
据的输入/输出等。
简述 fork 调用: 用 fork()创建一个新的进程,成为原先进程的子进程,原先进程
是父进程。
如何实现进程间的通信: UNIX 进程通信方式有信号,管道,消息,共享存储区和信
号量。
如何实现进程间的连接:可以利用管道和 socket
2、 写出下列函数的原型
int fork();
fork:
signal: int signal(int sig,int func);
pipe: int pipe(int fildes[2]);
tcsetpgrp:
int tcsetpgrp(int fildes,pid_t pgid_id)
3、运行和观察结果
fork.c
简述结果(不是执行结果):与执行 ls -l/相同
程序中如何区分父进程和子进程:通过 fork 的返回值 pid 的值的大小来区分子
进程和父进程,如果 pid 的值等于 0,表明是子进程,如果>0 表明是父进程,如
果小于 0,表明子进程创建失败
pipe.c
简述结果(不是执行结果): 相当于将 ls –l /etc/内容重定向到一个地方(程
序中是缓冲),然后用 more 命令以页为单位在屏幕上显示出重定向的内容
vp(prog2_argv[0],prog2_argv)(第 56 行)是否执行,如果没有执行是什么原因:会执行,
父进程创建子进程时后父进程和子进程的执行所随机的,所以只要第二次子进程创建成功,
都会执行这一句话。
signal.c
简述结果(不是执行结果):不断的输出父进程和子进程的 ID 号,父进程是 3693,
子进程是 3694
怎 样 让 函 数
ChildHandle
r 执 行 ? 当
子 进 程 接 收
到信号的时候就执行 ChildHandler 函数
process.c
简述结果(不是执行结果):显示 parent 和 child 进程的进程号,其中 parent
的进程号为 5193,child 的进程号为 5194,然后使子进程所在的进程组成为前台
进程组,然后执行 vi
进 程
列 表
中 有
几
个 ./p
rocess,区别在哪里:进程中有两个,一个所主进程,在后台等待输入,子进程在前台调用
vi
1. 杀死主进程后,出现什么情况:子进程也结束了
实验总结:
1.通过本次实验,了解了 linux 下的软件开发工具 gcc 的具体使用方法
2.学会用 man 帮助手册,查看一些系统调用的具体内容
3 学习使用 Linux 的系统调用,如用信号和管道,对进程进行管理和完成进程之间的通信