查看“Linux-2019-spring”的源代码
←
Linux-2019-spring
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看和复制此页面的源代码。
= Linux 操作系统 课程主页 = *Teacher: [http://hlt.suda.edu.cn/~zhli/ 李正华] * 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 * [https://pan.baidu.com/s/18xF9-GorGGuJN0-XVlItMg Linux课程的百度云分享链接(2018年教学视频)] - 密码: 45n2 * [http://hlt.suda.edu.cn/index.php/Linux-2019-spring-final-score 期末总成绩(待定)] = 实践作业 = * 请登录csteaching.suda.edu.cn网站,认真完成实验报告,并将代码和readme.txt打包作为附件上传 ** 实验报告应该严格按照模板要求认真填写,[http://hlt.suda.edu.cn/~zhli/exp-report.doc 实验报告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++ = 讲义 = == 后期内容 == [http://hlt.suda.edu.cn/index.php/Linux-2019-spring-misc 杂项记录] * 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 == === 进程管理 === * [http://hlt.suda.edu.cn/~zhli/teach/top-ps.JPG 黑板板书总结] * ps [http://www.runoob.com/linux/linux-comm-ps.html runoob-ps]:了解一下即可 $man ps 语法比较复杂,三种格式的参数option * top:x M === shell中wildcard 通配符 === * [http://hlt.suda.edu.cn/~zhli/teach/wild-card.JPG 黑板板书总结] *?匹配任意一个字符; *匹配任意长度个任意字符;[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*' [http://www.runoob.com/linux/linux-comm-find.html runoob-find] $ man find可以学到很多东西,可以和 | xargs结合 == 2019.4.10 == === shell基础 === * $ man bash (GNU Bourne-Again Shell, Free Software Foundation) ** [https://baike.baidu.com/item/GNU GNU_is_Not_Unix] * 命令的执行过程 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 ./: 查看.命令或者:命令 === 外部命令的执行过程 === * [http://hlt.suda.edu.cn/~zhli/teach/shell-run-cmd.JPG 黑板板书总结] * 进程切换;父进程、子进程 (fork, clone) ** [http://hlt.suda.edu.cn/~zhli/teach/process-fork.JPG 黑板板书总结] ** 作业3:生产者消费者 == 2019.4.3 (第6周/共17周,6月19日最后一次课) == === vi的使用 === * [http://hlt.suda.edu.cn/~zhli/teach/vim.jpeg 黑板板书总结] * 三个模式之间转换 命令--->插入模式(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是怎么工作的 * [http://hlt.suda.edu.cn/~zhli/teach/shell.peg 黑板板书总结] == 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
返回至
Linux-2019-spring
。
导航菜单
个人工具
登录
名字空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
新闻
成员介绍
研究组
科研项目
发表论文
在线演示
工具
链入页面
相关更改
特殊页面
页面信息