Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、

Slides:



Advertisements
Similar presentations
进 程. “ 程序 ” 和 “ 进程 ” 进程是 OS 对 CPU 执行的程序的运行过程的一种抽象。进程有自 己的生命周期,它由于任务的启动而创建,随着任务的完成(或 终止)而消亡,它所占用的资源也随着进程的终止而释放。 Linux 内核中通常把进程称为任务,每个进程主要通过一个称为进程描 述符(
Advertisements

第 20 章 檢視系統資訊.
上課教材 Database Slide Windows筆電 (32 bit)
命令行操作 shell介绍 常见三种Shell ---Bourne shell(sh) ---C shell(csh)
行程(process).
四資二甲 第三週作業 物件導向程式設計.
第七章 操作系统接口 7.1 联机用户接口 7.2 Shell命令语言 7.3 系统调用 7.4 UNIX系统调用 7.5 图形用户接口.
Web Programming 網際網路程式設計
Linux 的檔案管理.
資訊安全與系統管理 2013/3/13 Chien wei lin.
基于操作系统的编程复习 张玉宏
UNIX系統與資料庫安裝 Why UNIX 常用的工具程式介紹 資料庫的安裝.
第一讲:Linux基础培训.
Confidential Property
Vi 編輯器的練習的說明 因為本課程的實習課是Unix 的工作環境。過去的經驗告訴我,如果你完全未用過Unix 的指令及其 vi 編輯器,你將很難跟上進度,希望學員一定要預先作練習。我們提供了Unix 指令的簡介,以及 vi 編輯器的介紹 ( 請参閱網站中的13&14-unix.pdf 為其講義;13-unix.exe、14-fortran.exe則為其課程錄影.
第三讲 shell 程序设计.
第 2 章 上機使用 Unix/Linux 內容: 操作介面 主機連線 登入主機 認識系統環境 使用者常用命令.
南京天石软件技术有限公司 陈锺 (QQ: Solaris 10 C编程 南京天石软件技术有限公司 陈锺 (QQ:
台灣大學計算機及資訊網路中心 教學研究組 張傑生
chapter 1-Introduction
Shell Script 程式設計.
Shell程序设计 曙光信息产业股份有限公司.
第五章 shell 编程 shell 编程的基本过程分为三步: 1. 建立 shell 文件 包含任意多行操作系统命令或shell命令的文本
編譯環境介紹.
Linux 基础与常用命令简介 生物信息学培训班 杭州,2018年1月18日 周银聪.
第7章 Linux环境编程.
第二天 计算机基础技能培训 (一)linux基础知识
Linux server 連線軟體: 主機:kitty.cs.pu.edu.tw 帳號:dar 密碼:n….w.
1 Introduction Prof. Lin-Shan Lee TA: Chun-Hsuan Wang.
第三章 词法分析.
曙光集群简明使用手册 技术支持中心.
Linux基本操作 程設實習課 ( 2/25 ).
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
进程操作.
Process management(程序管理)
第 20 章 帳號與磁碟空間管理 著作權所有 © 旗標出版股份有限公司.
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
第12章 shell编程基础 本章主要介绍shell编程的基础知识。shell脚本的执行类似于Linux下的任何其他命令,脚本可以包含复杂的逻辑,也可以包含一系列Linux命令行指令。在一个shell程序内可以运行其他shell脚本。通过本章的学习,读者可以学到如何使用bash(最流行的Linux.
实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法;
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab3.
檔案類型介紹 Linux 的檔案類型 目錄: 用ls –F時檔名後面有/,螢幕列出目錄時為藍色 可執行檔: 壓縮檔: 連結檔:
第二章 UNIX系统安装与常用命令.
第六章 shell 程序调试 一. 程序执行状态跟踪 程序: -n 读取命令, 但不执行. 主要用于跟踪程序流程是
如何有效率的學習Linux 培養組合能力 多用程式, 少寫程式 從錯誤訊息中學習 養成略讀 “各種文件” 加強英文基本閱讀能力 勤作筆記
Confidential Property
第二章 流编辑器sed 一. 什么是流编辑器? 流编辑器是一种流水线型的、非交互式
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab3.
UNIX指令-檔案與目錄操作.
作業系統 第四章 行程.
C语言环境配置.
杨振伟 清华大学 第一讲:Linux环境下编程(1)
实验一:编译运行Linux内核并使用gdb进行调试
Lab01 工作站&Linux操作 日期:2011/03/07.
累堆排序法 (Heap Sort).
1.3操作系统提供的服务和用户接口 操作系统提供的用户接口 程序接口与系统调用 操作接口与系统程序
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
台灣大學計算機及資訊網路中心 教學研究組 張傑生
第 7 章 进程间的通信.
Computer Science & Information Management
实验二:添加Linux系统调用及熟悉常见系统调用
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab4.
粒子物理与核物理实验中的数据分析 杨振伟 清华大学 第1讲:Linux环境下的编程.
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
杨振伟 清华大学 第一讲:Linux环境下编程(1)
判斷(選擇性敘述) if if else else if 條件運算子.
劉庠宏、林合治編著 國立高雄大學應用數學系 2005年3月1日
第六章 文件系统与文件管理 6.4 Linux文件管理 1、比较MS DOS 与 Linux的目录结构 一、Linux文件系统的树形结构
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

Linux 环境及 Shell 程序 操作系统实验 1

二、 Shell 编程与进程通信

常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、 > 、 | 目录操作 cd 、 pwd 、 ls mkdir 、 cp 、 mv 、 rm -r 文本过滤 head 、 tail 、 grep 、 sort 、 sed 、 awk 其他 find 、 expr 获取信息: man

Shell 简介 shell 是用户和内核之间的接口。为屏蔽内核复杂性,在内核周 围建一个外壳( shell ),用户向 shell 提出请求, shell 将请求传 给内核。 Shell 有多种,一般使用 bash ( bonurne shell )。 Shell 是一种命令解释器,支持变量、函数、控制语句等,类似 于一种高级编程语言。 以 #!/bin/sh 开头,指示所用的命令解释器, # 后接注释

为什么要有 shell 脚本 系统管理员每天需要进行大量且重复的管理工作 ,如文件路径备份、更新等。这时候可以将重复 进行的操作写入一个文本文件,作为 shell 脚本运 行。 如,系统管理员每天都需要运行如下命令 groupadd groupname usradd –m username1 -g groupname usradd –m username2 –g groupname -m 默认方式, /home/username1

Shell 脚本运行过程 编写 shell 脚本 使用任意编辑器( gedit 、 vim 、 nano 等)编写脚本 添加执行权限: chmod u+x test.sh 运行脚本:./test.sh 运行脚本的几种方式 sh 脚本名 : sh 只执行 bash ,读文件,只需 r 权限;开启新的儿子 shell 运行脚本./ 脚本名 :当前目录下该脚本,作为可执行程序运行,需 x 权限,每 次开启新的儿子 shell 运行脚本. 脚本名:. 是一个命令,不开启儿子 shell ,当前 shell 运行

Vim 编辑器 三种模式 插入模式: 键盘按键当作文本 命令模式: 键盘按键当作命令 底行模式: 输入 “:” 进入。 另存为 :w 新文件名 保存退出 :wq 不保存退出 :q!

Shell 脚本示例 #!/bin/sh #This is s1 sudo groupadd g1 sudo usradd –m u1 –g g1 sudo usradd –m u2 -g g1 chmod u+x s1./s2 /etc/group 查看组 /etc/passwd 查看用户

Shell 脚本示例 #!/bin/sh #This is s2 #print “Hello Shell!” echo “Hello Shell!” chmod u+x s2./s2

Shell 的变量 变量名 = 变量值 不需要声明类型,直接赋值使用 等号后无空格,若变量值中有空格,需要引号,如 a=“hello world” 都为字符串类型,数值运算需要外部命令, expr 变量取值:在变量名称前加 “ $ ” 双引号 “” :可引用除 $ 、 ` 、 \ 外任意字符或字符串 单引号 ‘’ :可引用引号里所有字符(包括引号) $ A=a $ echo $A 输出结果为 a $ echo “$A” 输出结果为 a $ echo ‘$A’ 输出结果为 $A

系统变量和特殊变量 系统变量 env 命令查看所有环境变量 $HOME 用户主目录, ~ $PATH 执行命令时所搜寻的目录 特殊变量 $0 这个程序的执行名字 $n 这个程序的第 n 个参数值 $* 这个程序的所有参数 $# 这个程序的参数个数 $$ 这个进程的 PID $? 执行上一个指令的返回值 test.sh: #!/bin/sh echo Filename: $0 echo Arguments: $* echo Number of args.: $# echo 1st arg.: $1 echo 2nd arg.: $2 执行:./test.sh 1 2

条件测试 测试文件状态 -d: 目录 -s: 文件非空 -f: 正规文件 -w: 可写 -L: 符号链接 -u: 文件有 suid 位 -r: 可读 -x: 可执行 表达式 -eq = -ne != -gt > -lt < -n 非空串 -z 空串 -le <= -ge >= 逻辑操作 -a && -o || ! # [ -f /etc/passwd -a -f /etc/inittab ] # echo $? 0 # [ -x /etc/passwd -o -x /bin/sh ] # echo $? 0

控制语句 if 语句 if [ 条件测试 ] then action elif [ 条件 ] then action else action fi #!/bin/sh scores=40; if [ $scores -gt 90 ] then echo "very good!" elif [ $scores -gt 80 ] then echo "good!" elif [ $scores -gt 60 ] then echo "pass!" else echo "no pass!" fi

for 循环: for var in [list] do commands... done while 循环: while [condition] do commands... done 循环语句 #!/bin/sh number=1 while [ $number -le 10 ] do useradd user$number echo Add a user whose name is:user$number number=`expr $number + 1` done

进程通信 进程间通信的作用 进程间需要数据传输、资源共享和事件通知。 进程间通信的方式 管道通信(无名管道和命名管道) 信号通信 内存资源共享 消息队列 信号量

管道通信 管道是单向的、先进先出的,把一个进程的输出 和另一个进程的输入连接在一起。一个进程(写 进程)在管道的尾部写入数据,另一个进程(读 进程)在管道的头部读出数据。 管道包括无名管道和有名管道两种,前者用于父 子进程间通信,后者用于运行任意两进程通信。

无名管道 创建无名管道: pipe() #include int pipe(int filedes[2]); 成功返回 0 ,否则返回 -1 filedes 是两个文件描述符, filedis[0] 为管道读端, filedis[1] 为管道写端

无名管道 读管道 使用读文件描述符 fd[0] ,调用 read( ) 系统调用。 #include ssize_t read(int fd,void *buf,size_t nbytes); 返回:读到的字节数,若已到文件尾为 0 ,出错为 -1 。 写管道 使用写文件描述符 fd[1] ,调用 write( ) 系统调用。 #include ssize_t write(int fd,const void *buf,size_t nbytes); 返回:已写字节数,若出错为 -1 。

fork () 创建子进程 一个现有进程调用 fork 函数可以创建一个子进程。 fork 函数被调用一次但返回两次。若在子进程中则返 回 0 ,父进程中则返回子进程 ID 。 main() {int i=fork(); if(i != 0) { 父进程执行的程序段; } else if (i != -1) { 子进程执行的程序段; } 父子进程都执行的程序段; }

Wait() 阻塞自己,直到子进程死亡 进程调用 wait (),立即阻塞自己,由 wait 自动分析是 否当前进程的某个子进程已经退出,如果让它找到了 这样一个已经变成僵尸的子进程, wait 就会收集这个 子进程的信息,并把它彻底销毁后返回;如果没有找 到这样一个子进程, wait 就会一直阻塞在这里,直到 有一个出现为止

无名管道 父进程写数据,子进程读数据 先调用 pipe() 创建一个管道用于父子进程间通信,再调 用 fork() 创建一个子进程,该子进程会继承父进程所创 建的管道。必须在系统调用 fork() 前调用 pipe() 。 之后如父进程关闭写端,子进程关闭读端,就可以实 现子进程向父进程发送消息。

管道  pipe(fd) 创建一个管道( #include ), fd[0] 为管道的 读端; fd[1] 为管道的写端。管道可用来实现父进程与其子孙进 程之间的通信。管道以 FIFO 方式传送消息。 例:  main()  {int x,fd[2];  char buf[30],s[30];  pipe(fd); /* 创建管道 */  while((x=fork())= = -1); /* 创建子进程失败时,循环 */  if(x = = 0)  {sprintf(buf,“This is an example\n”);  close(fd[0]);  write(fd[1],buf,30); /* 把 buf 中的字符写入管道 */  exit(0); }  wait();  read(fd[0],s,30); /* 父进程读管道中的字符 */  printf(“%s”,s);  }

Linux 下 c 编程 运行 c 文件, hello.c 为例 gcc 文件名./ 运行程序 gcc hello.c 编译 + 链接,得到可执行文件 a.out gcc –o hello hello.c 编译 + 链接,得到可执行文件 hello C 语言源程序.c 编译器 gcc 可执行文件

实验: Shell 编程与父子进程通信

作业 Shell 编程 设计一个 shell 程序,添加一个新组为 class1 ,然后添加 属于这个组的 30 个用户,用户名的形式为 stdxx ,其 中 xx 从 01 到 30 。 父子进程间管道通信 创建一个无名管道和子进程,子进程向父进程发送消 息(如 ”This message is sent from child process” ) ,父进程在收到消息后能做出反应(打印出 ”the parent process has received the message” 和该消息 )