“Linux-2019-spring”的版本间的差异
(→讲义) |
(→实践作业) |
||
| 第23行: | 第23行: | ||
** 实验报告应该严格按照模板要求认真填写,[http://hlt.suda.edu.cn/~zhli/exp-report.doc 实验报告word模板下载] | ** 实验报告应该严格按照模板要求认真填写,[http://hlt.suda.edu.cn/~zhli/exp-report.doc 实验报告word模板下载] | ||
** readme文件应该详细说明编译运行等 | ** readme文件应该详细说明编译运行等 | ||
| + | * 实验作业3:c语言实现cpdir命令【2019年5月9日上机课之前完成】 | ||
| + | ./a.out 3 5 10 100 // 分别表示,有3个生产者,5个消费者,仓库的容量为10,一共生产100个产品,消费完之后就停止 | ||
| + | 程序最开始就随机产生一个(0,3)之间的浮点常量,表示生产一个产品的时间,时间和生产者的数量成正比 | ||
| + | 同样,最开始随机产生一个(0,5)之间的浮点常量,表示消费一个产品的时间 | ||
| + | 生产或消费或产品的过程可以用sleep实现 | ||
| + | 如果仓库满了,生产者就阻塞(休息),无法把生产好的商品放到仓库中 | ||
| + | 如果仓库空了,消费者就阻塞(休息) | ||
| + | 屏幕中要汇报进展信息(一定要注意,屏幕输出不能混杂) | ||
| + | 第0号生产者开始生产第70个商品 | ||
| + | 第1号生产者把第35号商品放到了仓库的第5个位置 | ||
| + | 第4号消费者从仓库的第5个位置拿出了第35号商品 | ||
| + | 第4号消费者将第35号商品消费完成 | ||
| + | |||
* 实验作业2:c语言实现cpdir命令【2019年4月14日晚上20:00前完成】 | * 实验作业2:c语言实现cpdir命令【2019年4月14日晚上20:00前完成】 | ||
编译后,在命令行输入 cpdir dir1 dir2可以递归将dir1复制为dir2,和cp -r dir1 dir2的功能一致 | 编译后,在命令行输入 cpdir dir1 dir2可以递归将dir1复制为dir2,和cp -r dir1 dir2的功能一致 | ||
2019年4月25日 (四) 04:56的版本
Linux 操作系统 课程主页
- Teacher: 李正华
- Teach Assistant: 江心舟
- Linux课程QQ群:643979822
- 2019春季学期
- 写给自己的话
- 内容不可能面面俱到,抓住重点(以及自己感觉最重要的知识点)即可,其他需要靠学生自己去探索
- 多鼓励学生自己思考
课程信息
- 上课时间和地点:
- 周三10:10-12:00理工楼153上理论课;
- 周四10:10-12:00(单周)理工楼243上机课(434备用,目前用不到)
- 成绩分布:平时10-15分、实践20-25、期末60(计划)
- Linux课程QQ群:643979822
- Linux课程的百度云分享链接(2018年教学视频) - 密码: 45n2
- 期末总成绩(待定)
实践作业
- 请登录csteaching.suda.edu.cn网站,认真完成实验报告,并将代码和readme.txt打包作为附件上传
- 实验报告应该严格按照模板要求认真填写,实验报告word模板下载
- readme文件应该详细说明编译运行等
- 实验作业3:c语言实现cpdir命令【2019年5月9日上机课之前完成】
./a.out 3 5 10 100 // 分别表示,有3个生产者,5个消费者,仓库的容量为10,一共生产100个产品,消费完之后就停止
程序最开始就随机产生一个(0,3)之间的浮点常量,表示生产一个产品的时间,时间和生产者的数量成正比
同样,最开始随机产生一个(0,5)之间的浮点常量,表示消费一个产品的时间
生产或消费或产品的过程可以用sleep实现
如果仓库满了,生产者就阻塞(休息),无法把生产好的商品放到仓库中
如果仓库空了,消费者就阻塞(休息)
屏幕中要汇报进展信息(一定要注意,屏幕输出不能混杂)
第0号生产者开始生产第70个商品
第1号生产者把第35号商品放到了仓库的第5个位置
第4号消费者从仓库的第5个位置拿出了第35号商品
第4号消费者将第35号商品消费完成
- 实验作业2:c语言实现cpdir命令【2019年4月14日晚上20:00前完成】
编译后,在命令行输入 cpdir dir1 dir2可以递归将dir1复制为dir2,和cp -r dir1 dir2的功能一致
- 实验作业1:c语言实现myls命令【2019年4月11日上机课前完成】
编译后,在命令行输入 myls dir可以显示dir1目录下的文件(包括目录),并且输出每一个文件的权限、时间、大小、拥有着等信息,类似于ls -l dir。
Linux核心思想
- 每个程序只做一件事,做到最好,功能完善:vim+gcc+gdb = visual studio c++
讲义
后期内容
- tab键自动补全
- AM:(0:00-12:00)ante meridiem or ante meridian; 上午;PM:(12:00-24:00)post meridiem or post meridian; 下午
5、wc: word count
shell常用技巧
ctrl+a回到命令的最开始 ctrl+e回到命令的最末尾 ctrl+u清除一行的命令 ctrl+r history
屏幕对应的文件:标准输入输出stdin;stdout;stderr $clear或者 ctrl+l:清屏
注:“tab”键,自动补全文件名、命令名
bg background后台
fg fore ground前台
fc fix command/history修改命令
ctrl+c:杀死(kill?)进程
ctrl+d:"EOF"信号
sed
awk(在shell脚本之前讲)
2019.4.24
shell重定向
- 标准输入重定向 stdin--->file
- 标准输出重定向 stdout--->file
a->b b->c ... A->B ...
输入重定向:写一个简单的代码来解释(很多命令都是同时支持:a文件参数;b默认标准输入,如sort)
myencrypt.c
输出重定向:
$./myencrypt > yy.txt
只输出标准错误输出stderr:I am stderr
$./myencrypt >> yy.tx 追加
$./myencrypt > yy.tx 2>&1:标准错误的输出也写入了yy.txt中
stdin=0;stdout=1;stderr=2
egrep命令
简单学习一下
管道
cat main.txt main.c >x1 egrep 'stdout'>x2 wc -l x2 rm cat main.txt main.c | egrep 'stdout' | wc -l:和上面的操作一样 cat stdoutxxx main.txt main.c 2>&1 | egrep 'stdout' | wc -l:标准错误输出重定向 rm */*.output:把所有文件下*.output删除 cat */*.txt |egrep '^[0-9- ]+' -o |sort >y1 :-o只输出匹配的东西
myencrypt.c就可以作为例子
$help history |less 分屏显示
正则表达式
结合egrep命令
一、复习
- 正则表达式
- egrep命令:
1、egrep命令用于在文件内查找指定的字符串。egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。egrep是用extended regular expression语法来解读的,而grep则用basic regular expression 语法解读,extended regular expression比basic regular expression的表达更规范。
2、grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
$egrep 'int' main.c $egrep -n 'int' (ctrl + d 输入结束) $egrep -n '[ijklm]nt' $egrep -n '[^0-9]nt':加^表示取反 $egrep -n '[0-9]nt' $egrep -n '.nt' $egrep -n 'a*bc' $egrep -n 'a*?bc' $egrep -n 'a?bc' $egrep -n '[0-9]*bc' $egrep -n 'abc|bcd' $egrep -n '(abc|bcd)[0-9]+' $egrep -n '^(abc|bcd)' $egrep -n '^(abc|bcd)$'
- 正则表达式 regular expression
正则表达式的定义:表达正则语言的一个式子;以一定规则写出来的一个字符串,作为一个抽象的模式,用以匹配一个、多个甚至无穷多个实际的字符串。
1、literal字面意思
2、[ ] 字符集 $egrep -n '[0-9]nt'
3、 . 任意一个字符,不能匹配\n\r
4、重复修饰符(贪心 greedy): * 表示前面的字符匹配0次到n次;? 表示可取0个/1个 ;+ 重复一次到无穷多次 ;{3} 重复3次;{3,5} 三次到五次 ;{3,} 三次到无穷
5、分组:() ;| 或
6、定位符:^表示行首,$表示行尾,单词的首/尾(自学)
通配符 * ?
正则表达式 .* .
1、vi中支持基本的正则表达式语法
vi中查找:$vim a.txt ;
/std (查找)
:s/std/stdin/(当前行的第一个std替换成stdin)
:s/std/stdin/g(当前行std全局替换成stdin,第一个/是定界符)
:%s/std/stdin/(所有行的第一个std替换成stdin)
:%s/std/stdin/g(所有行std全局替换成stdin,第一个/是定界符) 等价于:0,$s/std/stdin/g
:s/std/stdin/3(当前行开始3行的第一个std替换成stdin)
:s/std/stdin/g3(当前行开始3行的std全局替换成stdin)
:26s/std/stdin/g(26行std全局替换成stdin,第一个/是定界符)
:23,26s/std/stdin/g(23到26行std全局替换成stdin,第一个/是定界符)
:.,$s/std/stdin/g(当前行到文章末尾std全局替换成stdin,第一个/是定界符)
:.,.+3s/std/stdin/g(当前行开始3行std全局替换成stdin)
:s/std[inout]*/(&)/g2(当前行开始2行stdin或者stdout全局替换成加括号的stdin和stdout)
:15,20d(删除15到20行)
:0,.d(删除零到当前行)
2、基本语法
. [] [a-Z]:字符类(集合),只能匹配一个字符 [0-9]等价于\d(预定义字符类)等价于digit: [^] [ \t\r\n]:空白符(空格,tab,回车)等价于\s等价于space: * ? {} () &
二、新内容 1、sed (stream editor)
语法sed [opt] "cmd" file
编辑 ----vim 打开文件替换
----sed:不用打开文件
sed 's/std/stdin/g' main.txt > main.2.txt :main.txt内容不变,定界符还可以为#
sed -i 's/std/stdin/g' main.2.txt :会替换掉main.2.txt中的内容
sed -r 's/^([0-9]*)([/t ]*)([^/t ]*)/\3\2\1/' main.txt :(第一个^表示一行的开始,\1表示第一分组(括号)匹配的内容)
sed -r 's/^(([0-9]*)([/t ]*)([^/t ]*))/\4\3\2/' main.txt :分组按照左括号开始匹配内容
sed -r 's/std[inout]*/(&)/g' main.2.txt
删除 sed '2,&d' main.txt
sed '/^std/d' main.txt 删除以std开头的行
2019.4.17
进程管理
- 黑板板书总结
- ps
runoob-ps:了解一下即可 $man ps 语法比较复杂,三种格式的参数option
- top:x M
shell中wildcard 通配符
- 黑板板书总结
- ?匹配任意一个字符; *匹配任意长度个任意字符;[abcd]匹配中括号中的某一个字符;[a-z]匹配一个范围
$ls /bin/?a??? $ls /bin/f* $ls /[cd]* :匹配中括号中的某一个字符开头的文件
- shell来处理的通配符
$ls home/*:相当于ls /home/zhenghua /home/yli /home/a.txt $ls -d /home/*:不显示文件夹内的东西 $cp *.txt xxx
find命令
$ find . -name '*xxx*' runoob-find $ man find可以学到很多东西,可以和 | xargs结合
2019.4.10
shell基础
- $ man bash (GNU Bourne-Again Shell, Free Software Foundation)
- 命令的执行过程
mv x.c xx.c
step1 -- 解析字符串
step2--分析命令的类型并执行
1、内嵌命令-函数;
2、外部命令-找到可执行文件-执行(a、系统调用的方法执行;b、开启一个新的进程,load到RAM中,参数设置,切换进程;bash输入/执行外部命令通过创建一个子进程来完成)
3、别名命令:找到原命令执行
- shell变量、环境变量
$ echo $PATH 查看路径 疑问:shell如何搜索外部命令?
内部命令和外部命令
- 命令的类型
1、外部命令:mv和less是外部命令(linux系统下可以找到这个命令对应的可执行文件就是外部命令,大部分放在bin目录下且大部分命令是外部命令);
2、别名类型的命令:ls is aliased to 'ls --color=none';
3、内嵌命令:命令的可执行命令在shell 里面;shell的类型有bash和dash等。
type:类型--- $type ls mv cd less查看命令的类型
alias: 取别名--- $alias lm='ls -a'
- 常见内部命令
cd history:显示之前输入的所有命令 $fc -s love=hate 232 替换232命令中的love为hate
- 查看内部命令帮助文档(man、help)
$man bash/builtins:查看内部命令
输入“/^\s+history”正则表达式搜索
$help ./: 查看.命令或者:命令
外部命令的执行过程
2019.4.3 (第6周/共17周,6月19日最后一次课)
vi的使用
- 三个模式之间转换
命令--->插入模式(i/I光标在行首/a/A光标在行尾/o光标在下一行/O上面再插入一行,光标在下一行) 插入模式--->命令模式下(ESC键,u撤销,x删除一个字符,r替换,yy复制一行,p粘贴,dd删除一行,3dd删除三行:set nu 显示行号;^光标到行首,$光标到行尾,G光标到最后一行,:5直接跑到第五行,3G跑到第三行) 命令--->视图模式(v) 按字符选择 命令--->视图行模式(V) 按行选择 命令--->按列选择(ctrl+v) 命令--->末行模式(/搜索 n正向找,N反着找; ?反向搜索;正则表达式查找/o[uv]---找到所有含有ou或者ov的字符;“:!date”可查看时间;“:r!date”将命令执行的结果保存在当前文本中;“:n1,n2s/word1/word2/g n1和n2为数字,在第n1行和n2行之间寻找word字符串,并将该字符串替换为word2 :1,$s/word1/word2/g 从第一行到最后一行查找字符串word1字符串,并将字符串word1替换为word2 :1,$s/word1/word2/gc 从第一行到最后一行查找字符串word1,并将字符串word1替换为word2,在替换之前提示用户确认是否替换(confirm)”替换) vi filename---进入命令模式---输入“i/insert”---进入插入模式----按“ESC”---进入命令模式---“:wq”---保存退出
- 打开多个文件
命令模式“:sp”利用“ctrl +w+w”进行切换
中枢,中轴
c语言命令行参数的实现
#include<stdio.h>
int main(int argc, char *argv[]) {
int i = 0; for (; i < argc; ++i) { fprintf(stdout, "%d: %s\n", i, argv[i]); } fflush(stdout); char c = fgetc(stdin); while (c != EOF) { if (c >= 'a' && c <= 'z') { c = c + 'A' - 'a'; } fputc(c, stdout); c = fgetc(stdin); } fflush(stdout); fprintf(stderr, "I am stderr\n"); fflush(stderr);
}
argc:参数的个数 argv:字符串数组;argv[0]:命令本身
$gcc main.c -o hi
$./hi hello dads dff 0:./hi 1:hello 2: dads 3:dff I am stderr
shell
- 理解shell是什么
- 了解shell是怎么工作的
- 黑板板书总结
2019.3.27
- 目录的rwx
r:打开目录,list目录包含的文件 w:目录中增加或删除文件 x:进入目录,作为当前工作目录。即使没有r权限,也可以打开已有文件(前提是知道文件名,可否修改?)。
- 文件操作命令
which mkdir 可执行文件的绝对路径 whereis mkdir(查看命令mkdir所在的位置:1、命令的可执行文件位置;2、命令的帮助文档) man 2 mkdir (系统调用) man 1 mkdir (命令) man 3 printf (库调用) printf "%d%s\n" 10, "hi" mkdir (-p) mv -f (--force: do not prompt before overwriting) -i (--interactive: opposite to -f) -n (--no-clobber: do not overwite an existing file) [-T] (--no-target-directory: treat DEST as a normal file) cp -t (target dir) -R/-r (--recursive: copy directories recursively) rmdir rm -r (--recursive) -f (--force) -i (--interactive=always) -I (--interactive=once)
- ctrl+c ctrl+d ctrl+a ctrl+e ctrl+r
- 文本文件查看命令
cat 拼接(concatenate) (不跟参数的时候:默认将标准输入的内容标准输出),
tac
tail -n 3 a.txt
tail -f a.txt监控文件
head -n 30 a.txt
more
less (less is more):分屏/页 显示;
空格 翻屏;上下箭头 按行移动;
ctrl + f/b (^F或^B): forward/backward翻屏
输入/字符串或者正则表达式 进行搜索,按n(next下一个)继续搜索,按N反向继续搜索
G (shift+g):末行;gg:首行
- 文件编辑器
1、vi --- vim:打开文件
命令模式:按“Esc”回到命令模式;“h”“←”左;“l”“→”右;
末行模式:在命令模式下,输入“:”进入末行模式
编辑模式/插入模式:命令模式下,按"i/I/o/O/a/A"进入编辑模式;
- 遗留问题:
为什么which cd,没有显示结果?
2019.3.20
- ls命令:深入学习命令的使用
ls -l /home:长格式
第一个字符d表示文件夹,-表示文件,接下来的连续三个owner的权限,然后三个是group的权限;最后三个是other的权限;
24:硬链接数
zhenghua:owner
zhenghua:group
4090:表示文件所占的物理空间,表示的是该目录自身所占内存的大小,不是该目录下所有文件相加所占的空间。
mar 26 10:31 :时间信息
zhenghua :文件的名字
ls -a /home:
ls -dl /home: 如果参数是目录,不是看包含的内容,而是看目录本身的信息
ls -l -d /home 同上
ls -lc /home: 【显示ctime】
ls -r,--reverse /home:逆序
ls -R /home:递归显示
ls --color=nevel|auto|never /home:
ls -lh:大小信息
ls -t /home 根据时间排序
ls -al:
ls --full-time:完整时间信息
ls --hide=a*
讲了一点通配符和RE的对应关系: *=.* [A-Z]=[A-Z]
- stat命令
权限、拥有者、inode、block等信息
文件的三个时间信息:
atime: accesss:读文件
mtime:modify:修改文件内容(文件加长、vim下w、文件长度不变的修改)
ctime:change:修改文件内容、chown、chmod 【man ls -c中的解释:修改文件状态status信息的最新时间】
- man
man 3 printf:(synopsis 用法; description 描述)看在线文档
man ls :(LS(1): Name ; synopsis: ls [option]... [file]...可以跟0个到n个选项或者文件)
man pwd:
option:可以是长选项(--all)或者是短选项(-a),ls --all和ls -a实现的效果是一样的。
1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]
- 遗留问题
对于目录而言,atime mtime ctime分别什么意思
对于目录而言,rwx分别表示什么意思
ls -l 显示的是哪个时间?atime?
ls -t 根据什么时间排序?atime?
2019.3.13
Linux的文件目录结构 (续)
- root目录及超级用户
$ su # cd :切换到root的家目录下(/root) # exit :回到普通用户下 bin--可执行文件,二进制; etc--配置文件;boot--操作系统启动相关的代码;home--家目录,一个用户自己的目录,通常情况下每个普通用户都在home下面有一个目录,超级管理员在/root下
- 文件名规则
linux下文件名大小写区分,windows下不区分
linux下文件名最长为256字节,尽量不要用中文
linux下几乎所有的符号都可以作为文件名的一部分,只有“/”不能作为文件名的一部分出现(斜杠“/”:slash;反斜杠“\”:backslash)
特殊字符如空格、括号等需要用双引号或反斜杠\来书写
隐藏文件:文件名以.开头。ls 看不到隐藏文件;ls -a 可看到隐藏文件夹。
文件夹(目录)也是一种文件
- 绝对路径和相对路径
“.”表示当前目录 “..”表示上一级目录 绝对路径:从根目录开始到目标文件的路径 相对路径:从当前目录(不是从根目录开始)到目标文件的路径
文字终端
- 图形终端下的文字终端Terminal
XWindow下打开了Terminal应用程序(快捷键:ctrl+alt+t)【航站楼】
- 输入一些简单命令
ls $ cd :切换目录(change directory)。 $ cd ~ :回到当前用户的根目录下
date, cal, calendar, bc, echo
uptime:系统启动的时间 hostname:机器名 who:显示当前登录的用户,以及用户从哪里登录进来的 users:目前有几个用户登录了这个系统 w:和who类似,同时可以显示每个用户在干啥 whoami:写程序的时候会用到
$ uname -a :命令是uname;-a是选项(显示全部的信息);可以查看内核(kernel)版本号等。 $ pwd:显示当前工作目录(print working directory)
- 深入理解命令
命令的结构:命令(command) 选项(option) 参数(argument)
例子:cd:后面不加参数时,默认切换到当前用户的家目录下。
1、命令:一个操作
2、选项:操作方式
3、参数:操作对象
ls -l 命令详细解释。 思考问题:目录的硬链接数(类似于Python中一个对象绑定的名字数)如何计算?
2019.3.6
操作系统的作用
- 管理硬件资源
- 为程序员提供API
- 为普通用户提供界面(GUI、CLI)
Linux和Windows的一些区别
- 图形界面
菜单栏隐藏在最上面 默认有四个工作区workplace ctrl+alt+上下左右键:可以在四个工作区之间切换 ctrl+shift+alt+上下左右键:把当前焦点窗口拖到另外一个工作区 有自己的文本编辑器 熟悉一下资源管理器
- Linux的文件目录结构
- 标准化(windows下是乱七八糟的)
- bin(二进制);dev(设备);boot(启动);home(所有用户的家目录)
- 只有一个根目录 /(windows下每个分区有一个目录)
- 家目录(Home Folder)
- 每个用户都有一个家目录,存放自己的私有数据
- 用户的家目录通常在/home/用户名
- 除非别人允许,用户A无法访问用户B的家目录(权限的概念)
- 权限管理使得Linux支持真正的多用户
讲课期间用到的几个命令
- cd(change command)、ls (list files)
杂项
- 文字界面下的提示符:prompt symbol,通常包含的信息:用户名@机器名: 当前工作目录 $
2019.2.27
- 介绍课程基本情况,个人介绍,对读书、独立思考的看法
- 讨论了操作系统的概念、作用,相当于回忆操作系统理论课的内容
- /dev/stdin (stdout, stderr),为什么要区分标准输出和标准错误输出?
- g++ gcc cout cerr printf fprintf