Linux下c语言编程实验讲义.docx
- 文档编号:12221370
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:32
- 大小:48.76KB
Linux下c语言编程实验讲义.docx
《Linux下c语言编程实验讲义.docx》由会员分享,可在线阅读,更多相关《Linux下c语言编程实验讲义.docx(32页珍藏版)》请在冰豆网上搜索。
Linux下c语言编程实验讲义
课程名:
Linux下c语言编程
专业:
08嵌入式系统工程专
试验1:
Linux系统基本shell指令
试验2:
gcc编译器与多文件交叉包含
试验3:
库文件的创建与使用
试验4:
linux系统程序调试-行列式求值程序
试验5:
进程与线程程序调试
试验6:
TCP程序与
试验7:
UDP程序
试验1Linux系统基本shell指令
实验一Linux系统基本文件操作
试验目的:
掌握Linux系统常见的文件操作指令;
掌握Linux系统常见的文件形式;
试验设备
PC机、虚拟机、redhat9,桌面环境KDE
试验原理
一、Linux系统常见的文件形式
(一)为便于用户识别文件形式,操作系统一般使用扩展名来标示文件类型。
文件扩展名是文件名的最后一个点之后的部分(在文件sneakers.txt中,“txt”是文件的扩展名)。
下面简单列出了一些文件扩展名和它们的含义:
1.压缩的和归档的文件
.bz2—使用bzip2压缩的文件
.gz—使用gzip压缩的文件
.tar—使用tar(tapearchive,磁带归档的简写)压缩的文件,又称tar文件
.tbz—用tar和bzip压缩的文件
.tgz—用tar和gzip压缩的文件
.zip—使用ZIP压缩的文件,在MS-DOS应用程序中常见。
多数为Linux压缩的文件使用gzip压缩,因此Linux文件中的.zip归档较少见。
2.文件格式
.au—音频文件
.gif—GIF图像文件
.html/.htm—HTML文件
.jpg—JPEG图像文件
.pdf—文档的电子映像;PDF代表PortableDocumentFormat(可移植文档格式)
.png—PNG图像文件(PortableNetworkGraphic的简写,可移植网络图形)
.ps—PostScript文件,为打印而格式化过的文件
.txt—纯ASCII文本文件
.wav—音频文件
.xpm—图像文件
3.系统文件
.conf—一种配置文件。
配置文件有时也使用.cfg。
.lock—锁(lock)文件;用来判定程序或设备是否正在被使用
.rpm—RedHat用来安装软件的软件包管理器文件
4.编程和脚本文件
.c—C程序语言的源码文件
.cpp—C++程序语言的源码文件
.h—C或C++程序语言的头文件
.o—程序的对象文件
.pl—Perl脚本
.py—Python脚本
.so—库文件
.sh—shell脚本
.tcl—TCL脚本
文件扩展名不总是被使用或被一致地使用。
那么,如果一个文件没有扩展名,或者它与它的扩展名不符时怎么办呢?
这个时候,file命令就会对你有所帮助。
譬如,你找到了一个叫做saturday的文件,它没有扩展名。
使用file命令,你就可以判定这个文件的类型:
filesaturday
(二)为便于系统磁盘和文件系统的管理,Linux系统将所有Linux对目录和设备都当作文件来进行处理,这样就简化了对各种不同类型设备的处理,提高了效率。
Linux中主要的文件类型分为4种:
普通文件、目录文件、链接文件和设备文件。
(1)普通文件
普通文件如同Windows中的文件一样,是用户日常使用最多的文件。
它包括文本文件、shell脚本(shell的概念在第2章会进行讲解)、二进制的可执行程序和各种类型的数据。
(2)目录文件
在Linux中,目录也是文件,它们包含文件名和子目录名以及指向那些文件和子目录的指针。
目录文件是Linux中存储文件名的惟一地方,当把文件和目录相对应起来时,也就是用指针将其链接起来之后,就构成了目录文件。
因此,在对目录文件进行操作时,一般不涉及对文件内容的操作,而只是对目录名和文件名的对应关系进行了操作。
(3)链接文件
链接文件有些类似于Windows中的“快捷方式”,但是它的功能更为强大。
它可以实现对不同的目录、文件系统甚至是不同的机器上的文件直接访问,并且不必重新占用磁盘空间。
(4)设备文件
Linux把设备都当作文件一样来进行操作,这样就大大方便了用户的使用(在后面的
Linux编程中可以更为明显地看出)。
在Linux下与设备相关的文件一般都在/dev目录下,它包括两种,一种是块设备文件,另一种是字符设备文件。
块设备文件是指数据的读写,它们是以块(如由柱面和扇区编址的块)为单位的设
备,最简单的如硬盘(/dev/hda1)等。
字符设备主要是指串行端口的接口设备。
Linux中的文件属性
Linux中的文件属性如图如示。
首先,Linux中文件的拥有者可以把文件的访问属性设成3种不同的访问权限:
可读(r)、可写(w)和可执行(x)。
文件又有3个不同的用户级别:
文件拥有者(u)、所属的用户组(g)和系统里的其他用户(o)。
第一个字符显示文件的类型:
★“-”表示普通文件;
★“d”表示目录文件;
★“l”表示链接文件;
★“c”表示字符设备;
★“b”表示块设备;
★“p”表示命名管道比如FIFO文件(FirstInFirstOut,先进先出);
★“f”表示堆栈文件比如LIFO文件(LastInFirstOut,后进先出)。
第一个字符之后有3个三位字符组:
★第一个三位字符组表示对于文件拥有者(u)对该文件的权限;
★第二个三位字符组表示文件用户组(g)对该文件的权限;
★第三个三位字符组表示系统其他用户(o)对该文件的权限;
★若该用户组对此没有权限,一般显示“-”字符。
目录权限和文件权限有一定的区别。
对于目录而言,r代表允许列出该目录下的文件和子目录,w代表允许生成和删除该目录下的文件,x代表允许访问该目录
二、Linux系统常见文件操作指令
(一)DOS和Linux常用命令的对比
命令的目的
MS-DOS
Linux
Linux的简单实例
复制文件
Copy
cp
cpthisfile.txt/home/thisdirectory
转移文件
Move
mv
mvthisfile.txt/home/thisdirectory
列举文件
Dir
ls
Ls
清除屏幕
Cls
clear
Clear
关闭shell提示
Exit
exit
Exit
显示或设置日期
Date
date
Date
删除文件
Del
rm
rmthisfile.txt
把输出“回响”到屏幕上
Echo
echo
echothismessage
用简单文本编辑器来编辑文件
Edit
gedit([a])
geditthisfile.txt
比较文件内容
Fc
diff
difffile1file2
在文件中寻找字串
Find
grep
grep词或词组thisfile.txt
格式化软盘
formata:
(如果软盘是在A:
中的话)
mke2fs或mformat([b])
/sbin/mke2fs/dev/fd0(/dev/fd0是Linux中与A:
等同的驱动器)
显示命令帮助
命令/?
man([c])
man命令
创建目录
Mkdir
mkdir
mkdir目录
查看文件
More
less([d])
lessthisfile.txt
重新命名文件
Ren
mv([e])
mvthisfile.txtthatfile.txt
显示你在文件系统中的位置
Chdir
pwd
Pwd
用指定的路径(绝对路径,absolutepath)来改换目录
cd路径名
cd路径名
cd/directory/directory
用一个相对路径(relativepath)来改换目录
cd..
cd..
cd..
显示时间
Time
date
Date
显示已被使用的内存数量
Mem
free
Free
注:
a.Gedit是图形化文本编辑器;你可以使用其它文本编辑器来代替Gedit,包括Emacs和vi。
b.这个命令为DOS文件系统格式化软盘。
c.某些命令你还可以使用info。
d.more分页器也可以用来一个屏幕一个屏幕地在文件中逐页查看。
e.mv命令可以转移文件或重新命名在同一目录下的文件。
如果你想重新命名文件,如例中所示,把这个文件“转移”到同一目录中的新名称。
(二)几点说明
1、关于帮助
help命令用于查看所有Shell内置命令的帮助信息。
用户可以通过该命令寻求Shell命令的用法,只需在所查找的命令后输入help命令,就可以看到所查命令的内容了。
例如:
查看cd命令的使用方法。
$cd--help
man命令用于用于格式化并显示某一命令的联机帮助手册页。
格式:
man[选项]命令名
如果在用户是在纯文本下登录,可能帮助信息显示太快使用户来不及看清,可使用管道连接指令如mangcc|less(使用q退出,可按上下箭头查看)
2、关于ls指令和创建链接文件的指令
默认情况下,系统不显示隐藏文件及文件属性,如果想显示文件的详细信息,可以使用如下命令ls–al
链接文件的指令为:
ln-S
3、系统管理指令
显示系统进程的指令:
ps
关闭进程的指令kill
关闭系统的指令poweroff
用户管理程序redhat-config-users//KDE/systemsettings/usersandgroups
系统日志redhat-logviewer//KDE/systemtools/systemlogs
删除自安装文件:
(1)查看当时安装的时候的文件的详细名字rmp-qa查看所有安装的文件,也可以在系统日志中查看
(2)删除rmp-e
系统文本登录方式及图形用户方式配置文件
/etc/inittab方式3命令行登录;方式5x-window登录
从X-Windows退出ctrl+art+backspace
从文本方式进入x-windowstartx
4、文件压缩和归档
压缩文件使用较少磁盘空间,并且比未压缩的大文件下载速度要快。
在RedHatLinux中,你可以使用的文件压缩工具有:
gzip、bzip2、和zip。
推荐你使用bzip2压缩工具,因为它提供了最大限度的压缩,并且可在多数类似UNIX的操作系统上找到。
gzip压缩工具也可以在类似UNIX的操作系统上找到。
如果你需要在Linux和其它操作系统如MSWindows间传输文件,你应该使用zip,因为该命令与Windows上的压缩工具最兼容。
压缩工具
文件扩展名
解压工具
Gzip
.gz
gunzip
bzip2
.bz2
bunzip2
Zip
.zip
unzip
试验2:
makefile创建与使用
试验目的:
1、掌握桌面环境KDE的基本使用方法
2、掌握KDE代码编辑器kwrite的基本使用方法
3、掌握多源文件编译链接的方式
4、掌握makefile的写法
试验原理
(1)多源文件编译链接的方式
编译:
狭义的编译是指将高级语言代码翻译成汇编代码;
汇编:
狭义的汇编是将汇编代码翻译成二进制(机器语言代码)代码,对于出现子程序调用的语句,如果该函数是主文件外部实现的,则在主文件汇编的时候,该调用并不真正去实现该调用。
链接:
将各个函数的实现文件所汇编成的机器码和主程序链接到一起。
形成最终的可执行文件。
头文件功能:
函数类型声明,全局结构体声明,宏声明。
(2)makefile的写法
依赖关系:
依赖关系主要靠表达符号“:
”表示,含义指冒号左侧的符号依赖右侧的符号,或由右侧的符号生成。
命令规则:
命令规则的第一个符号为TAB符号,一般为编译汇编指令(gcc)或其他shell指令。
当命令规则上面的一条依赖文件出现更新时,系统将执行本行代码
(3)试验过程
使用编辑器kwrite创建相关源文件,各个源文件代码如下:
//main.c
#include"mytool1.h"
#include"mytool2.h"
#include
intmain(void){
putchar('\n');
mytool1_print("hello");
mytool2_print("hello");
return0;}
//mytool1.c
#include
voidmytool1_print(char*psz){
printf("thisismytool1print:
%s\n",psz);}
//mytool1.h
voidmytool1_print(char*);
//mytool2.c
#include
voidmytool2_print(char*psz){
printf("thisismytool2print:
%s\n",psz);}
//mytool2.h
voidmytool2_print(char*);
//makefile
main:
main.omytool1.omytool2.o
gcc-omainmain.omytool1.omytool2.o
main.o:
main.cmytool1.hmytool2.h
gcc-c-gmain.c
mytool1.o:
mytool1.cmytool1.h
gcc-c-gmytool1.c
mytool2.o:
mytool2.cmytool2.h
gcc-c-gmytool2.c
试验报告要求
写出各个源文件
试验3:
linux系统程序调试-行列式求值程序
试验目的:
掌握使用gdb调试程序的方法
试验器材:
PC机器、redhat9,kde
试验原理
(1)程序可以被调试的原因
程序编译的时候,使用特殊的指令在目标文件之间加入特殊的信息,建立程序目标码和程序源代码之间的联系,调试程序利用这些信息控制程序的流程,帮助程序员分析程序实际执行过程与程序员设计执行过程之间的联系,进而找出程序的错误。
(2)调试程序的流程
1、编程程序的时候使用-g指令,生成调试版程序;
2、在gdb中调入调试版程序;
3、在程序的起始位置加入断点breakmain
4、运行程序
5、使用step指令,next指令单步运行程序,使用continue指令运行到程序的下一个断点,使用display,print指令查看和更改变量的数值,分析程序的实际运行过程和设计过程之间的差别。
(3)要调试程序如下:
#include"stdio.h"
#include"time.h"
#defineMUCH_ZERO
typedefintType;
Type*JZyzs(Type*b,Type*a,intnn,inti,intj)
{
intm,n,N=nn-1;
for(m=0;m
{for(n=0;n b[m*N+n]=a[m*nn+n]; for(;n b[m*N+n]=a[m*nn+n+1]; } for(;m {for(n=0;n b[m*N+n]=a[m*nn+nn+n]; for(;n b[m*N+n]=a[m*nn+nn+n+1]; } returnb; } TypeHLSabsDigui(Type*a,unsignedintn) { unsignedinti,j,k; TypeT=0,t; Type*p=NULL; if(n<=1)return(*a)*n; p=(Type*)malloc(sizeof(Type)*(n-1)*(n-1)); if(! p){puts("Err");return0;} for(i=0,t=1;i { JZyzs(p,a,n,0,i); #ifdefMUCH_ZERO if(a[i]) #endif { T+=(HLSabsDigui(p,n-1)*t*a[i]); } } free(p); returnT; } intmain() { Typea[400]={8,1,-5,1,9,-3,0,-6,-5,2,-1,2,0,4,-7,6}; intn=4; clock_tstart,end; clrscr(); start=clock(); printf("\n#%d\n",HLSabsDigui(a,n)); end=clock(); printf("%lf\n%f\n",(end-start)/CLK_TCK,(end-start)/CLK_TCK); getch(); } 试验报告要求: 单步运行程序,分析程序执行过程,写出程序流程图 试验4进程与线程程序调试 试验目的: 通过程序清晰进程与线程的概念; 试验器材: PC机、redhat9,kde 试验过程 (1)进程程序如下: #include #include #include intmain(void) { pid_tpid; unsignedlongi; intj=printf("jububianliang\n"); for(i=0;i<100000000;i++) ; if((pid=fork())<0) { printf("forkerror! \n"); exit (1); } elseif(pid==0) { printf("Childprocessisprinting.\n"); } else { printf("Parentprocessisprinting.\n"); } exit(0); } 提示: 调节循环次数,使循环次数接近系统默认时间片轮转时间,查看父进程和子进程不同次序的输出情况。 (2)线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。 传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。 现在,多线程技术已经被许多操作系统所支持,包括Windows/NT,当然,也包括Linux。 为什么有了进程的概念后,还要再引入线程呢? 使用多线程到底有哪些好处? 什么的系统应该选用多线程? 我们首先必须回答这些问题。 使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。 我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。 而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。 据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。 使用多线程的理由之二是线程间方便的通信机制。 对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。 线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。 当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。 除了以上所说的优点外,不和进程比较,多线程程序作为一种多任务、并发的工作方式,当然有以下的优点: 1)提高应用程序响应。 这对图形界面的程序尤其有意义,当一个操作耗时很长时,整个系统都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使用多线程技术,将耗时长的操作(timeconsuming)置于一个新的线程,可以避免这种尴尬的情况。 2)使多CPU系统更加有效。 操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。 3)改善程序结构。 一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。 下面我们先来尝试编写一个简单的多线程程序。 2简单的多线程编程 Linux系统下的多线程遵循POSIX线程接口,称为pthread。 编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。 顺便说一下,Linux下pthread的实现是通过系统调用clone()来实现的。 clone()是Linux所特有的系统调用,它的使用方式类似fork,关于clone()的详细情况,有兴趣的读者可以去查看有关文档说明。 下面我们展示一个最简单的多线程程序example1.c。 /*example.c*/ #include #include voidthread(void) { inti; for(i=0;i<3;i++) printf("Thisisapthread.\n"); } intmain(void) { pthread_tid; inti,ret; ret=pthread_create(&id,NULL,(void*)thread,NULL); if(ret! =0){ printf("Createpthreaderror! \n"); exit (1); } for(i=0;i<3;i++) printf("Thisisthemainprocess.\n"); pthread_join(id,NULL); return(0); } 我们编译此程序: gccexample1.c-lpthread-oexample1 试验报告要求;写出进程和线程的调试程序 试验5: 库文件的创建与使用 试验目的: 掌握库文件工作的原理,库文件的创建和使用方法 试验器材: 试验原理: 一、为什么要使
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 语言 编程 实验 讲义