实验7:系统环境与进程通信
1、实验目的
(1)掌握Unix/Linux的进程工作环境;
(2)掌握unix/Linux的程序执行方法;
(3)掌握Unix/Linux的信号通信编程。
2、实现设备
一台装有windows操作系统和工inux机系统的微机或服务器。
3、实验方法与注意事项
实验室内的实验环境与系统是共用设施,请不要在系统内做对系统或对其他用户不安全的事情。
要求每个同学登录后系统后,要在自己的家目录内容以自己(拼音)名字或学号,创建一个子目录(己有者可以不再创建)。以后所有工作都要在自己的目录内进行。建议以后的实验都在同台计算机上做,这样可以保持连续性。
用户要按通常实验要认真书写实验报告。
4、实验过程
题目一:列出环境变量
1.1知识储备:
1、Linux下main函数的参数:
(1)argc:命令行参数的个数(包括最开始的可执行文件名称), 第一个就是执行程序名,所以argc最少为1。
(2)argv:字符指针的数组,每个元素都是一个指向字符串的字符指针,,即命令行中的每一个参数;
命令行参数的列表,数组长度对应argc
(3)envp:字符指针的数组,每一个元素是指向一个环境变量的字符指针
字符数组的最后一个元素均为NULL指针
命令行参数:在命令行调用程序时传递的参数。在主函数main中用参数接收,linux或者dos命令中用空格间隔各参数,参数为空格时用双引号括起来
2、环境变量(名称=值)
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息//理解:存放多种信息的集合,当程序需要时从里面进行查找
1.2运行结果
结果列出了全部的环境变量以及两个特定的环境变量
题目二:
例2:通过命令行参数,显示指定环境变量。
可能通过命令行参数,显示指定环境变量的值。例如: ./a.out PATH HOME
#include <stdlib.h>
main (int argc ,char *argv [ ] , char *envp[ ])
int i;
for(i=0 ; i<argc ;i++)
printf ("var_Envp [ %s]=%s \n" , argv [i] , getenv (argv [i] ));
)
2.1 程序理解
输入 ./exp7.2 PATH HOME
Argc[0]=”./exp7.2” Argc[1]=”PATH” argc[2]=”HOME”
2.2运行结果
运行结果列出了PATH,HOME的环境变量
题目三:fork的使用,请观察并分析屏幕的输出
main ( ){
int i;
printf ("PPID=%d\n" , getppid ( ) ) ;while ( (i=fork ( ) )==-1) ;
printf ( "i=%d\n" ,i);if(i){
sleep ( 3);printf (
"Parent
process !,PPID=%d,PID=%d\n" , getppid () ,getpid( ) );
else {
printf (
"Child
process ! ,
PPID=%d,
P工D=%d\n" , getppid ( ) ,getpid ( ) ) ;
printf ("I am finished ! ! ! \n"' ) ;
3.1代码
3.2运行结果
题目四:进程间的通信
4.1题目
例4:信号通信。
编译后生成程序,比如 a.out。要求使用两个终端,比方说tty1,tty2,也可在图形界面上启动两终端。可在一个终端上运行程序,但该程序不会自动退出,ctrl_c也不能使其退出。可从另一终端上执行命令:
kill -USR1 PID或kill -USR2 PID或kill 一INT PID来观察正在运行的程序的屏幕输出。结束程序执行的办法是:
kil1 -9 PID或killall a.out
4.2预备知识
信号:
SIGINT 终端中断
SIGUSR1 用户定义信号1
SIGUSR2 用户定义信号2
signal是一个带signum和handler两个参数的函数,准备捕捉或屏蔽的信号由参数signum给出,接收到指定信号时将要调用的函数由handler给出
kill xx pid:
语法:kill [信号或选项] PID(s)
发送了一个信号给系统
参考: Linux 精通Linux的“kill”命令_小小工匠的博客-CSDN博客
4.3运行结果
运行的终端1
调用的终端
通信:
一个终端发送信号,一个终端捕捉