Linux学习笔记1115.docx
- 文档编号:12632974
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:77
- 大小:41.20KB
Linux学习笔记1115.docx
《Linux学习笔记1115.docx》由会员分享,可在线阅读,更多相关《Linux学习笔记1115.docx(77页珍藏版)》请在冰豆网上搜索。
Linux学习笔记1115
第1章环境
一、判断
1、grep用于在指定文件中搜索字符串
2、find用于查找某一文件的位置
3、系统调用是操作系统提供给应用程序的编程接口
4、系统调用函数通常在成功时返回0,不成功时返回非0值
5、库函数封装了部分系统调用以完成常见功能,具有良好的可移植性,表现为一定的标准
6、sort按字典顺序打印指定文件的内容
7、od命令将输入流转换为八进制或十六进制格式
8、nl命令用于为输出的每一行添加行号
10、wc命令可打印指定文件中的行、字和字节的数量
11、head命令可打印文件或流的前十行,可使用-n来指定应显示的行数
12、tail命令可打印文件或流的后十行,可使用-n来指定应显示的行数
13、在shell中,Ctrl+C组合键用于中断程序
14、在shell中,Ctrl+\组合键用于退出程序
15、在shell中,Ctrl+Z组合键用于挂起程序
16、调用库函数失败时,全局变量error可指示具体的错误编号
17、调用库函数失败时,可调用perror可打印具体的错误信息
18、调用系统调用是一个费时的过程,不能说系统调用函数比其他函数的执行效率高
19、man手册的1、2、3小节分别说明命令、系统调用和库函数
20、Linux中有man、info、howto等在线帮助文档
二、问答
1、如何在grep中使用正则表达式?
grep用于实现按内容查找,其调用格式为:
grep[选项]PATTERN[FILE]
grep在FILE或是标准输入中查找PATTERN。
在PATTERN中可使用正则表达式。
【例】查看printf函数的声明
$grep-E'\bprintf\b'/usr/include-r
…
/usr/include/stdio.h:
int_EXFUN(printf,(constchar__restrict,...)
正则表达式有顺序、选择、循环三种控制结构,分别表示为ab、a^b、a|b。
还可用\1、\2、\3等表示引用,\1引用前面的第一对圆括号中的内容、\2和\3引用前面第2、3对圆括号中的内容。
【例】假设文件1.txt的内容如下,分析各查询的结果。
$cat1.txt
a111
a112
a113
b111
b112
b113
a211
a311
b322
$grepa..11.txt
a111
a211
a311
圆点可匹配任何符号
$grep-E'.(2|3)..'2.txt
a211
a212
a213
a311
b322
c323
第二个字母是2或3
$grep-E'...*2'2.txt
a112
b112
a212
b322
c323
第3或4个字母是2
$grep-E'(.)\1'2.txt
a111
a112
a113
b111
b112
b113
a211
a311
b322
有连续两个字母相等
$grep-E'^c|3$'2.txt
a113
b113
a213
c323
首字母为c或尾字母为3
2、引号中的两条命令“./1.txt”与“../1.txt”有何差别?
这是运行脚本的两种方式。
前者在新的bash(进程)中运行脚本,后者在当前脚本(进程)中运行脚本。
下面通过实验来观察二者的差别。
编辑如下脚本。
$cat1.txt
readXX
echo$XX
该脚本的功能是要求用户输入一句话(一行数据),
把这句话保存到XX变量中,
然后再显示XX的值。
启动第二个cygwin窗口,在其中运行ps命令。
$ps
PIDPPIDPGIDWINPIDTTYUIDSTIMECOMMAND
5996481659965204cons050008:
17:
08/usr/bin/ps
4816148164816cons050008:
12:
42/usr/bin/bash
3016281230161184pty050017:
03:
54/usr/bin/bash
我们观察到有两个bash进程在运行。
回到第一个cygwin窗口,运行1.txt,但不输入数据,于是脚本要等待用户输入数据,它将运行较长的时间。
$./1.txt
_
切换到第二个cygwin窗口,再次运行ps命令。
$ps
PIDPPIDPGIDWINPIDTTYUIDSTIMECOMMAND
4732301647324732pty050008:
20:
44/usr/bin/bash
5932481659326056cons050008:
20:
48/usr/bin/ps
4816148164816cons050008:
12:
42/usr/bin/bash
3016281230161184pty050017:
03:
54/usr/bin/bash
我们发现运行结果中多了一个4732号进程(在读者的机器中进程的编号往往不同)。
这说明系统在一个新的bash进程中运行脚本。
再次进行上述实验,但把运行脚本的方式改为“../1.txt”(注意有两个圆点,并且在这两个圆点之间至少有一个空格),系统在等待用户输入数据。
$../1.txt
_
切换到第二个cygwin窗口,再次运行ps命令。
$ps
PIDPPIDPGIDWINPIDTTYUIDSTIMECOMMAND
5932481659326056cons050008:
20:
48/usr/bin/ps
4816148164816cons050008:
12:
42/usr/bin/bash
3016281230161184pty050017:
03:
54/usr/bin/bash
我们将发现这次没有启动新的bash进程,说明系统系统是在当前bash中运行脚本。
那么,这有什么关系呢?
它会对环境变量产生影响,请看问题3。
3、请写出下列脚本的运行结果
$cat1.txt
echo$XXX
echo1.txtend
$chmod+x1.txt
$cat2.txt
XXX=1234
../1.txt
./1.txt
exportXXX
../1.txt
./1.txt
echo2.txtend
$chmod+x1.txt
$./2.txt
请思考运行结果是什么?
运行结果:
1234
1.txtend
1.txtend
1234
1.txtend
1234
1.txtend
2.txtend
#首先建立环境变量XXX
XXX=1234
#在当前bash中执行1.txt,这时存在环境变量XXX,所以显示了1234。
../1.txt
#在新的bash中执行1.txt,由于其中没有XXX,所以不显示1234.
./1.txt
#export把环境变量复制给子进程,所以“./1.txt”也会显示1234。
exportXXX
../1.txt
./1.txt
echo2.txtend
由于“exportXXX”仅仅是复制XXX给子进程,即使子进程修改了XXX的值,主进程也无法得知子进程所做的改动。
现在把1.txt改为,
$cat1.txt
echo1.txtbegin
echoXXX=$XXX
XXX=333
echoXXX=$XXX
echo1.txtend
把2.txt改为,
$cat2.txt
XXX=111
echoXXX=$XXX
exportXXX
./1.txt
echoXXX=$XXX
再调用2.txt得到如下结果,
$./2.txt
XXX=111
1.txtbegin
XXX=111
XXX=333
1.txtend
XXX=111
请分析结果说明了什么问题。
把环境变量与C语言的变量的作用域进行对比。
可在函数中创建环境变变量,函数结束后该变量依然存在,直到进程结束。
可用unsetXXX来消除XXX。
请设计实验验证这里的说法。
第2章工具
一、判断
1、vim编辑器包括命令、底行和插入三种模式基本
2、为了使用gdb调试工具,在编译源程序时应使用-g选项加上调试信息
3、在vim的命令模式下,用:
wq完成存盘退出功能
4、在vim的命令模式下,按下i键可切换到插入模式
5、gcc可用来编译C和C++程序
6、vim在命令模式下输入冒号可进入到底行模式
7、在gcc中,.i文件是预处理后的C文件
8、在gcc中,.s文件是汇编语言源程序文件
9、gcc的-E选项让gcc在预处理后停止编译,生成.i文件
10、如果不用-o选项指定文件名,gcc将目标程序文件输出到a.out
11、gcc的-c选项让gcc只编译,而不执行连接操作
二、问答
1、把C语言程序编译成可执行文件包括哪几个步骤?
(P28)
2、gdb调试程序包括哪些基本功能?
(P31)
3、请说明下列命令的作用
cpp-ohello.ihello.c
gcc-Shello.i
as-ohello.ohello.s
ld-ohello.exehello.o-lcygwin-lkernel32
参考:
cpp-ohello.ihello.c
预处理,将源文件hello.c转变为hello.i文件
gcc-Shello.i
编译,将源文件hello.i转变为汇编语言文件hello.s
as-ohello.ohello.s
汇编,将汇编语言文件hello.s转变为成目标文件hello.o
ld-ohello.exehello.o-lcygwin-lkernel32
连接,生成可执行文件hello.exe
4、使用vim编辑hello.c程序,请说明基本操作步骤。
$cathello.c
#include
intmain(){
printf(“helloworld\n”);
}
参考步骤:
1)输入命令vimhello.c
2)按a(或i、o、c)进入编辑状态
3)输入源程序
4)按esc退出编辑状态(进入命令状态)
5)输入命令:
wq存盘退出
5、如何执行查找、替换、高亮显示?
在底行状态中输入
:
/\w\+@\w\+\(\.\w\+\)\+
需要注意的是括号、w、+前面都需要反斜杠,但圆点不需要
\w表示字母、数字、下划线
\+表示一个或多个
\.表示圆点本身而不是通配符
:
%s/x/y/g
%表示对所有行进行操作,
/x/y/表示把x替换为y,
g表示每行替换所有x,否则只替换第一个x
:
sethlsearch查询高亮
:
syntaxon语法高亮
第3章存储
一、判断
1、getopt用来解析命令行参数
2、env或set命令可查看当前系统环境信息
3、shortint占16位的存储空间
4、time函数可获取自1970-1-10:
0:
0以来经历的秒数
5、ctime函数可获取字符串格式的时间
6、main函数也可以带参数,如intmain(intargc,char*argv[]);
7、malloc用来在在堆中为动态变量申请内存空间
8、用free函数释放由malloc申请的动态内存
9、在当前文件中使用extern声明在其他源程序文件中定义的全局变量
10、可在所有.c文件中访问静态全局变量
二、问答
1、请分析下列程序的执行结果
$cattest.c
#include
#include
intf(inti,intj){
printf("inf()\n");
exit(0);
}
intg(inti,intj){
intm=3;
intn=4;
charszBuf[8]={0};
*(int*)((int)szBuf+20)=(int)f;
//szBuf[20]=(int)f;
return8;
}
intmain(){
g(1,2);
}
$cctest.c–o1
$./1
inf()
2、请分析下列程序的执行结果
$cattest.c
#include
#include
#definePASSWORD"1234567"
intcheck1(){
intr=0;
charbs[8];
printf("incheck1()\n");
printf("r=%d\n",r);
strcpy(bs,"bbbbbbbbb");
printf("r=%d\n",r);
return0;
}
intcheck2(char*p){
intr=0;
charbs[8];
r=strcmp(p,PASSWORD);
strcpy(bs,p);
returnr;
}
intmain(){
check1();
if(check2("bbbbbbbb"))
printf("testok\n");
else
printf("testfailed\n");
}
$cctest.c-o1
$./1
incheck1()
r=0
r=98
inmain()
testok
3、一个进程所占的内存空间包括哪几个组成部分?
(P37)
4、什么是静态变量?
(P42)
5、请写出下列程序的执行结果
#include
char*a="hello";
voidtest(){
char*c="hello";
if(a==c)printf("yes,a==c\n");
elseprintf("no,a!
=c\n");
}
intmain(){
char*b="hello";
char*d="hello1";
if(a==b)printf("yes,a==b\n");
elseprintf("no,a!
=b\n");
test();
if(a==d)printf("yes,a==d\n");
elseprintf("no,a!
=d\n");
}
结果
yes,a==b
yes,a==c
no,a!
=d
6、请写出下列程序的执行结果
$cattest.c
#include
char*a="hello";
voidtest();
intmain(){
char*b="hello";
printf("inmain:
");
if(a==b)printf("yes,a==b\n")
elseprintf("no,a!
=b\n")
printf("insub:
");
test();
}
$catfile.c
#include
externchar*a;
voidtest(){
char*c="hello";
if(a==c)printf("yes,a==c\n")
elseprintf("no,a!
=c\n")
}
$ccfile.ctest.c-otest
$./test
结果
inmain:
yes,a==b
insub:
no,a!
=c
7、请简要说明进程中堆和栈的区别。
(P44)
8、下面两段程序完成同样的任务,但顺序有所区别。
//t1.c
#include
#defineL11000
#defineL21000
inta[L1][L2];
intmain(){
inti,j,k;
for(k=0;k<10000;k++)
for(i=0;i for(j=0;j a[i][j]=1; printf("t1end\n"); } //t2.c #include #defineL11000 #defineL21000 inta[L1][L2]; intmain(){ inti,j,k; for(k=0;k<10000;k++) for(i=0;i for(j=0;j a[j][i]=1; printf("t2end\n"); } $cct1.c–ot1 $cct2.c–ot2 $time./t1;time./t2 t1end real0m13.650s user0m13.540s sys0m0.015s t2end real0m28.376s user0m28.344s sys0m0.015s 看看time命令的作用 $helptime time: time[-p]pipeline Reporttimeconsumedbypipeline'sexecution. 从结果来看,t2比t1花费了更多的时间。 虽然二者的功能相似,它们只相差一个语句, a[i][j]=1; a[j][i]=1; 这两个语句导致访问数组的顺序有差别。 t1是逐行访问各元素,t2是逐列访问各元素, 由于C的数组以行主序的顺序排列, 所以t1执行速度较快, t2因为在访问数组元素时会跳来跳去,所以就变慢了。 由于机器速度的差别,实验时可调整k的取值范围。 8、请举例说明export有何作用。 export是一个内部命令,所以用help来查看它的帮助信息。 $helpexport export: export[-fn][name[=value]...] MarkseachNAMEforautomaticexporttotheenvironmentofsubsequently executedcommands.IfVALUEissupplied,assignVALUEbeforeexporting. $X=hello $echo$X hello $sh $echoX=$X X= $exit $ecportX $sh $echo$X hello X2=world $exportX2 $exit $echoX2=$X2 X2= export实现单向传递,由主进程到子进程,但反之不然 第4章文件流 一、判断 1、ANSIC库IO函数是对POSIXIO函数的封装 2、fileno从文件流中提取其文件描述符 3、fdopen为一个文件描述符打开一个文件流 4、打开文件时,O_APPEND指定所写数据追加的到文件尾 5、最低可用原则是指打开文件时优先使用编号最小的空闲文件描述符 6、在Linux中,系统默认为每个进程打开三个文件 7、用库函数fopen打开一个文件后,将返回一个文件流指针 8、fopen打开一个文件后,将返回一个文件流指针 9、fopen("1.c","r+")表示以可读写的方式打开文件1.c 10、fclose在关闭文件之前,将缓冲区中的相关内容写到对应的文件中 二、问答 1、printf、fprintf、sprintf有何差别? 2、标准IO有哪几种类型的缓冲区? 它们各有什么特点? 3、读文件流的函数fgetc、fgets、fread有何差别? 4、请写出下列代码段的执行结果 #include intmain(){ charstr[100]={};; sscanf("123abcABC","%[0-9a-z]",str); printf("%s\n",str); memset(str,0,100); sscanf("123abcABC","%[^A-Z]",str); printf("%s\n",str); memset(str,0,100); sscanf("123abcABC","%4s",str); printf("%s\n",str); printf("%06.2f\n",123); } 结果 123abc 123abc 123a 000.00 5、请简要说明调用open函数时,O_SYNC、O_APPEND、O_CREAT、O_RDWR和O_NONBLOCK的作用(P105) 6、fdopen可以把句柄变为指针,反之,如何把指针变为句柄? fileno 三、设计 1、设计程序实现文件拷贝 #include #include #include #defineBUFFERSIZE4096 #defineCOPYMODE0644 voidoops(char*,char*); intmain(intac,char*av[]){ intin_fd,out_fd,n_chars; charbuf[BUFFERSIZE]; if(ac! =3){ fprintf(stderr,"usage: %ssourcedestination\n",*av); exit (1); } if((in_fd=open(av[1],O_RDONLY))==-1) oops("Cannotopen",av[1]); if((out_fd=creat(av[2],COPYMODE))==-1) oops("Cannotcreat",av[2]); while((n_chars=read(in_fd,buf,BUFFERSIZE))>0) if(write(out_fd,buf,n_chars)! =n_chars) oops("Writeerrorto",av[2]); if(n_chars==-1) oops("Readerrorfrom",av[1]); if(close(in_fd)==-1||close(out_fd)==-1) oops("Errorclosingfiles",""); } voi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 学习 笔记 1115