没有合适的资源?快使用搜索试试~ 我知道了~
Linux下c语言编程实验讲义.docx
0 下载量 9 浏览量
2022-12-19
04:14:37
上传
评论
收藏 73KB DOCX 举报
温馨提示
试读
27页
Linux下c语言编程实验讲义.docx
资源推荐
资源详情
资源评论
课程名:Linux下c语言编程专业:08嵌入式系统工程专
试验1 : Linux系统基本shell指令试验2: gee编译器与多文件交叉包含
试验3:库文件的创立与使用试验4: linux系统程序调试一行列式求值程序
试验5:进程与线程程序调试试验6: TCP程序与
试验7: UDP程序试验1 Linux系统基本shell指令
实验一 Linux系统基本文件操作试验目的:
掌握Linux系统常见的文件操作指令;掌握Linux系统常见的文件形式;
试验设备PC机、虚拟机、redhat9,桌面环境KDE
试验原理一、Linux系统常见的文件形式
(一)为便于用户识别文件形式,操作系统一般使用扩展名来标示文件类型。文件扩展 名
是文件名的最后一个点之后的局部(在文件sneakers. txt中,“txt”是文件的扩展名)。 下面简单列
出了一些文件扩展名和它们的含义:
1 .压缩的和归档的文件.bz2 一使用bzip2压缩的文件
gz —使用gzip压缩的文件.tar —使用tar (tape archive,磁带归档的简写)压缩的文件,乂称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代表Portable Document Format (可移植文档格
式)
.png 一 PNG图像文件(Portable Network Graphic的简写,可移植网络图形).ps - PostScript文件,为
打印而格式化过的文件
.txt — 纯ASCII文本文件.wav —音频文件
.xpm —图像文件unsigned int i,j,k;
Type T=O,t;Type *p=NULL;
if(n<= 1) return (*a)*n;p=(Type*) malloc(sizeof(Type)*(n-1 )*(n-1));
if(!p) {puts("Err"); return 0:} for(i=0,t=l;i<n;i++,t*=-l) {JZyzs(p,a,n,0,i);
#iRiefMUCH_ZEROif(a[i])
#endif(
T+=(HLSabsDigui(p,n-1 )*t*a[i]);}
) free(p);return T;
int main()(
Type a[400]={ 8,1 ,-51,9,-3。-6,-5,2,-1,204-7,6};
int n=4;
clock_t start,end;
clrscr();
start=clock();
printf("# %d",HLSabsDigui(a,n));
end二clock。;
printf('
,
%lf\n%f\n",(end-start)/CLK_TCK,(end-start)/CLK_TCK);
getch();}
试验报告要求:
单步运行程序,分析程序执行过程,写出程序流程图试验4进程与线程程序调试
试验FI的:通过程序清晰进程与线程的概念;试验器材:PC机、redhat9 , kde
试验过程
(1)进程程序如下:
#include <sys/lypes.h>#includc <stdio.h>
#include <unistd.h> int inain(void)(
pid_l pid;
unsigned long i;
int j=prinlf("ju bu bian liang\n");
for(i=0;i< 100000000;i++)
if((pid=fork())<0)
{printfC'fork error!\n");
exit(l);
)
else if(pid==O)
{printfC'Chikl process is printingAn");
1
else
{printf("Paren( process is printingAn");
Icxit(0);
提示:调节循环次数,使循环次数接近系统默认时间片轮转时间,查看父进程和子进程不同 次序
的输出情况。
(2)线程
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去, 是在80年代
中期,Solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但 是在一个进程(process)中
只允许有一个线程,这样多线程就意味着多进程。现在, 多线程技术已经被许多操作系统所支
持,包括Windows/NT,当然,也包括Linux。
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什 么的系统
应该选用多线程?我们首先必须回答这些问题。
使用多线程的理由之一是和进程相比,它是i种非常“节俭”的多任务操作方式。 我们知道,
在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立 众多的数据表来维护它的
代码段、塘栈段和数据段,这是一种“昂贵”的多任务工作方 式。而运行于一个进程中的多个线
程,它们彼此之间使用相同的地址空间,共享大部 分数据,启动一个线程所花费的空间远远小于
启动一个进程所花费的空间,而且,线 程间彼此切换所需的时间也远远小于进程间切换所需要的
时间。据统计,总的说来, 一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系
统上,这个数 据可能会有较大的区别。
使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独 立的数据空
间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而 且很不方便。线程那么
不然,由于同一进程下的线程之间共享数据空间,所以一个线程 的数据可以直接为其它线程所用,
这不仅快捷,而且方便。当然,数据的共享也带来 其他一些问题,有的变量不能同时被两个线程
所修改,有的子程序中声明为static的 数据更有可能给多线程程序带来灾难性的打击,这些正是编
写多线程程序时最需要注 意的地方。
除了以上所说的优点外,不和进程比拟,多线程程序作为一种多任务、并发的工 作方式,当
然有以下的优点:
1)提高应用程序响应。这对图形界面的程序尤其有意义,当一个操作耗时很长 时,整个系统
都会等待这个操作,此时程序不会响应键盘、鼠标、菜单的操作,而使 用多线程技术,将耗时长
的操作(time consuming)置于一个新的线程,可以防止这 种尴尬的情况。
2)使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不 同的线程运行于
不同的CPU上。
3)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独 立或半独立的
运行局部,这样的程序会利于理解和修改。
下面我们先来尝试编写一个简单的多线程程序。
2简单的多线程编程
Linux系统卜的多线程遵循POSIX线程接11,称为pthreack编写Linux卜的多 线程程序,需要使用
头文件pthread.h,连接时需要使用库libpthread.a。顺便说一下, Linux下pthread的实现是通过系统调
用clone ()来实现的。clone ()是Linux所 特有的系统调用,它的使用方式类似fork,关于clone ()的详细
情况,有兴趣的读 者可以去查看有关文档说明。下面我们展示一个最简单的多线程程序examplel.Co
/* example.c*/
#include <stdio.h>
#include <pthread.h>
void thread(void)
int i;
for(i=0;i<3;i++)
printf(
H
This is a pthread.\n°);
)
int main(void)
(
pthread_t id;
int i,ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if(ret!=O){
printf ("Create pthread error!\n");
exit (1);
)
for(i=0;i<3;i++)
printf("This is the main process.\n");
pthread Join(id, NULL);
return (0);
)
我们编译此程序:
gcc examplel .c -Ipthread -o examplel
试验报告要求;写出进程和线程的调试程序
试验5:库文件的创立与使用
试验目的:掌握库文件工作的原理,库文件的创立和使用方法
试验器材:
试验原理:
一、为什么要使用库文件我们在实际编程工作中肯定会遇到这种情况:有几个工程里有一些函数
模块的功能相同, 实现代码也相同,也是我们所说的重复代码。比方,很多工程里都有一个用户
验证的功能。 代码段如下:
〃UserLogin.h文件,提供函数声明
int IsValidUser(char* username, int namelen);
〃UserLogin.c文件,实现对用户信息的验证
int IsValidUscr(char* username, int namclcn)
(
int IsValid = 0;
/*下面是具体的处理代码,略去*/
return IsValid
)
如果每个工程都保存着这两个UserLogin.h和UserLogin.c文件,会有以下几个弊端:
1、每个工程里都有重复的模块,造成代码重复。
2、代码的重用性不好,一旦IsValidUser的代码发生了变化,为了保持设计的一致性, 我们还
要手工修改其他工程里的UserLogin.c文件,既费时又费力,还容易出错。库文件就 是对公共代码
的一种组织形式。
为了解决上面两个弊端,就提出了用库文件存放公共代码的解决方案,其要点就是把公 共的
(也就是可以被屡次狂用的)目标代码从工程中别离出来,统一存放到库文件中,工程 要用到这些
代码的时候,在编译或者运行的时候从库文件中取得目标代码即可。库文件又分 两种:静态库和
动态库。
二、静态库与动态库
如果程序是在编译时加载库文件的,就是使用了静态库。如果是在运行时加载目标代码, 就
成为动态库.换句话说,如果是使用静态库,那么静态库代码在编译时就拷贝到了程序的代 码段,
程序的体积会膨胀。如果使用动态库,那么程序中只保存库文件的名字和函数名,在运 行时去查
找库文件和函数体,程序的体枳基本变化不大。
静态库的原那么是“以空间换时间”,增加程序体积,减少运行时间;
动态库那么是“以时间换空间”,增加了运行时间,但减少了程序本身的体积。
下面我们就以实际例子来看看如何使用这两种库.
三、静态库的编写和使用I、概述
静态库文件的扩展名一般为a其编写步骤很简单。
⑴编写函数代码⑵编译生成各目标文件
⑶用ar文件对目标文件归档,生成静态库文件。
注意归档文件名必须以lib打头。
使用要点:
⑴在gcc的-I参数后加上静态库头文件的路径。
⑵在gcc的-L参数后加上库文件所在目录
⑶在gcc的-1参数后加上库文件名,但是要去掠lib和.a扩展名。
比方库文件名是libtest.a那么参数就是-1 test2、编写最简单的静态库文件
编写如下两个文件,注意放在同一目录中
剩余26页未读,继续阅读
资源评论
zzzzl333
- 粉丝: 676
- 资源: 7万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功