实验四Linux下的C语言编程Word格式.docx

上传人:b****4 文档编号:6342766 上传时间:2023-05-06 格式:DOCX 页数:15 大小:298.84KB
下载 相关 举报
实验四Linux下的C语言编程Word格式.docx_第1页
第1页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第2页
第2页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第3页
第3页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第4页
第4页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第5页
第5页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第6页
第6页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第7页
第7页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第8页
第8页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第9页
第9页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第10页
第10页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第11页
第11页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第12页
第12页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第13页
第13页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第14页
第14页 / 共15页
实验四Linux下的C语言编程Word格式.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验四Linux下的C语言编程Word格式.docx

《实验四Linux下的C语言编程Word格式.docx》由会员分享,可在线阅读,更多相关《实验四Linux下的C语言编程Word格式.docx(15页珍藏版)》请在冰点文库上搜索。

实验四Linux下的C语言编程Word格式.docx

其次要熟练掌握在LINUX

环境下用C语言进行高级编程的方法(即有关文件操作的系统调用的使用),进而充分了解LINUX文件系统中shell命令的实现原理以及用到的系统调用。

二、实验环境

操作系统:

任何Unix/Linux或MAC

编译器:

gcc

三、预备知识

1、关于系统调用和库函数

C语言支持一系列的库函数的调用,其中最基本的是studio库函数。

事实上,库函数只是C语言在较高层次上调用的方式,系统调用是更低层次的与C语言的界面,是核提供给用户调用的函数。

2、LINUX环境下系统调用和库函数的异同

⑴C程序使用系统调用的语句和调用库函数的语句形式完全相同,但是

二者运行的环境和运行机制截然不同。

⑵从运行环境来看,库函数使用依赖于所运行的用户环境,程序调用库

函数时,它运行的目标代码是属于程序的,程序处于“用户态”执行;

而系统调用的使用不依赖于它运行的用户环境,是LINUX核提供

的低层服务,系统调用时所执行的代码是属于核的,程序处于“核

心态”执行。

⑶程序库函数的调用最终还是要通过LINUX系统调用来实现,库函数一般执行一条指令,该指令(操作系统陷阱operatingsystem

trap)将进程执行方式变为核心态,然后使核为系统调用执行代码。

(1)、实验容

本实验要求在LINUX/UNIX环境下用C语言完成SHELL命令的编写,基本涉及了LINUX/UNIX文件系统中较为常用的有关文件操作的系统调用。

容如下:

1、编程实现lnk命令,执行格式:

lnkf1f2f3。

具体要求如下:

⑴分别使用link()和symlink()为文件f1(任意)创建其硬文件f2和符号文件f3。

⑵分别使用stat()和lstat()调用给出文件f2和f3的索引节点号、权限、存放该文件的设备号及文件修改时间,比较其异同。

说明原因。

#include<

sys/types.h>

sys/stat.h>

ftl.h>

unistd.h>

#include<

stdio.h>

intmain(intargc,charconst*argv[]){

structstatbuf;

if(argc!

=4)

{

printf("

inputerror\n"

);

return0;

}

if(link(argv[1],argv[2])==-1)

{

printf("

linkerror\n"

return0;

}

if(symlink(argv[1],argv[3])==-1)

symlinkerror\n"

if(stat(argv[2],&

buf)==-1)

{

statf2error\n"

statf2\n"

索引号节点号:

%ld\n"

buf.st_ino);

权限:

%o\n"

buf.st_mode);

设备号:

buf.st_dev);

文件修改时间:

buf.st_mtime);

if(stat(argv[3],&

statf3error\n"

statf3\n"

if(lstat(argv[2],&

buf)<

0)

lstatf2error\n"

lstatf2\n"

if(lstat(argv[3],&

lstatf3error\n"

lstatf3\n"

finished"

}

结果如下:

原因:

Stat对于硬和软连接都是返回所指文件的信息。

但是对于lstst,如果文件是符号,lstat返回的是符号本身的信息。

2、编程实现copy命令,执行格式:

copycj.txtf1

功能:

⑴复制前先将文件f1(见1)的容清空;

⑵分别使用fstat()、stat()和lstat()调用给出文件f1、f2和f3大

小及最近一次状态改变的时间;

⑶将实验三新创建文件cj.txt中前100个字节的容拷入f1中,在其后创建30个字节的空洞,然后再复制cj.txt中第141个字节之后的容到f1中;

⑷复制成功后,显示文件f2的大小及文件f1的容。

上述功能实现后可将空洞调大到几十~几百MB,然后用du命令显示文件f1占用的磁盘空间,观察其大小,分析原因。

问题:

①上述第⑵项中用fstat()替换stat()显示文件f2的信息可以吗?

什么?

答:

不可以,fstat是用文件的描述符指向文件。

②比较上述第⑷项和第⑵项的结果,文件f2的大小为何有变化?

F2是f1的硬,本质是一个文件,前面是对f1容清空了,后面在f1中放入了一些容,所以大小改变了。

程序可能涉及到的系统调用:

read(),write(),open(),creat(),close(),lseek(),stat(),fstat(),lstat()

intmain(intargc,char*argv[])

{

chars;

=3)

/*f1*/

inta=open("

f1"

O_CREAT|O_TRUNC|O_RDWR);

if(a==-1)

ERROR!

"

if(stat("

&

statf1error\n"

statf1\n"

大小:

buf.st_size);

最近一次状态时间:

%ld\n\n"

buf.st_ctime);

if(lstat("

lstatf1error\n"

lstatf1\n"

if(fstat(a,&

fstatf1error\n"

fstatf1\n"

/*f2*/

intb=open("

f2"

O_CREAT|O_TRUNC);

if(b==-1)

if(fstat(b,&

fstatf2error\n"

fstatf2\n"

close(b);

/*f3*/

intc=open("

f3"

if(c==-1)

if(fstat(c,&

fstatf3error\n"

fstatf3\n"

close(c);

intd=open("

cj.txt"

O_CREAT|O_RDWR);

if(d==-1){

/*inte=open("

if(e==-1)

}*/

intn;

if((n=read(d,&

buf,100))>

if(write(a,&

buf,n)!

=n)

{printf("

a/writeerror\n"

}

if(n<

readerror\n"

if(lseek(d,141,SEEK_SET)==-1)

{

printf("

error!

intm;

if(lseek(a,30,SEEK_CUR)==-1)

charbuf2[1000];

if((m=read(d,buf2,1000))>

if(write(a,buf2,m)!

=m)

d/writeerror\n"

if(m<

=0)

statf2的大小\n"

close(a);

intz=open(“f1”,O_RDONLY);

while(read(z,s,1)){

%c"

s);

}

\n"

close(d);

close(a);

截图如下:

(2)实验总结

通过这次实验熟悉了linux下文件系统的构建方法,学会了如何使用gcc编译c文件,和使用out的输入和操作。

更加熟悉了read()、open()、lseek()等等的使用方法,以及他们的反映执行结果的返回值,也明白了硬和软连接的区别,以及stat和lstat了解文件信息,以及他们的区别。

五、实验要求

1、做好实验预习,通过查找资料、阅读系统提供的帮助文件等多种渠道了解本实验所使用的系统调用及各种技术方法。

充分利用所学知识,尽可能多地预设实现思路。

2、写出实验报告,容是:

⑴简要说明实验的目的、任务与设备。

⑵写出实现的技术手段及关键代码。

⑶总结设计中遇到的问题及解决方法。

⑷写出实验心得与收获。

六、使用系统调用时的注意事项

以下列出了几条系统调用和库函数有关出错处理的不同点,更多的容还需大家通过编程积累。

⑴对于studio库中的函数,出错时会返回一个预定义的常量EOF或NULL;

许多库函数在出错时常常返回0或–1;

有些库函数则返

回某种出错代码。

⑵系统调用的出错处理比较简单,每个系统调用在出错时都返回–1,

在调用成功时返回0(或某些其他具有特定意义的整数值)。

LINUX系

统调用把出错代码放在一个名为error的外部变量中,在程序中包含头文件error.h,便可以得到error的错误代码。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2