实验四 Linux下的C语言编程
实验四Linux下的C语言编程
实验类别:设计型实验时数:6学时
开课单位:计算机学院计算机科学与技术系实验地点:健翔校区计算中心
一、实验目的
通过本实验练习,使学生掌握有关文件管理与文件操作的内容。
首先要熟悉在LINUX系统下文件系统的构建方法;其次要熟练掌握在LINUX 环境下用C语言进行高级编程的方法(即有关文件操作的系统调用的使用),进而充分了解LINUX文件系统中shell命令的实现原理以及它们用到的系统调用。
二、实验环境
操作系统:任何Unix/Linux及Sun Solaris 或windows 系列
应用系统:gcc编译器。
若OS为windows系列,则还需相应的模拟环境
三、预备知识
1、关于系统调用和库函数
C语言支持一系列的库函数的调用,其中最基本的是studio库函数。
事实上,库函数只是C语言在较高层次上调用的方式,系统调用是更低
层次的与C语言的界面,是内核提供给用户调用的函数。
2、L INUX环境下系统调用和库函数的异同
⑴C程序使用系统调用的语句和调用库函数的语句形式完全相同,但是
二者运行的环境和运行机制截然不同。
⑵从运行环境来看,库函数使用依赖于所运行的用户环境,程序调用库
函数时,它运行的目标代码是属于程序的,程序处于“用户态”执行;
而系统调用的使用不依赖于它运行的用户环境,是LINUX内核提供
的低层服务,系统调用时所执行的代码是属于内核的,程序处于“核
心态”执行。
⑶程序库函数的调用最终还是要通过LINUX系统调用来实现,库函数
一般执行一条指令,该指令(操作系统陷阱operating system trap)
将进程执行方式变为核心态,然后使内核为系统调用执行代码。
四、实验内容
本实验要求在LINUX/UNIX环境下用C语言编写三个具体的SHELL 命令,基本涉及了LINUX/UNIX文件系统中较为常用的有关文件操作的系统调用。
内容如下:
⑴编程实现copy命令,执行格式:copy file1 file2 file3
功能:将file1、file2两文件的内容合并拷入file3中,其中间应有30个字节的空洞。
程序可能涉及到的系统调用:read(), write(), open(), creat(),
close(), lseek()
⑵编程实现renam(即LINUX下的rename)命令,功能是实现文件的重命名。
执行格式:renam filea fileb;
其中filea为源文件,fileb为目标文件。
程序执行时应显示出命令行的所有参数,并给出重命名前后两个文件的大小、索引节点号及最近一次状态改变的时间。
程序可能涉及到的系统调用:read(), write(), open(), stat(), close(),
link(), unlink()
⑶编程实现:从A文件某处(任意)读取n个字符(连续),写入B文件某
个位置。
执行格式:a.out A x n B y;
其中a.out为编译后的可执行程序;
x为A文件的任意位置;
y为B文件的任意位置;
程序可能涉及到的系统调用:read(), write(), open(), close(),
lseek()
五、实验要求
1、做好实验预习,通过查找资料、阅读系统提供的帮助文件等多种渠道
了解本实验所使用的系统调用及各种技术方法。
充分利用所学知识,
尽可能多地预设实现思路。
2、写出实验报告,内容是:
1简要说明实验的目的、任务与设备。
2写出实现的技术手段及关键代码。
3总结设计中遇到的问题及解决方法。
4写出实验心得与收获。
六、使用系统调用时的注意事项
以下列出了几条系统调用和库函数有关出错处理的不同点,更多的内容还需大家通过编程积累。
⑴对于studio库中的函数,出错时会返回一个预定义的常量EOF或
NULL;许多库函数在出错时常常返回0 或–1 ;有些库函数则返回
某种出错代码。
⑵系统调用的出错处理比较简单,每个系统调用在出错时都返回–1 ,
在调用成功时返回0 (或某些其他具有特定意义的整数值)。
LINUX系
统调用把出错代码放在一个名为error的外部变量中,在程序中包含
头文件error.h,便可以得到error的错误代码。
Linux下的C语言编程(4)
目录结构(2) 编译方式(2)
./
greeting.h functions greeting.c
my_app.c 分步编译 命令: 1、$gcc -c my_app.c -I functions 2、$gcc -c functions/greeting.c 3、$gcc my_app.o greeting.o –o my_app 思路: 编译每一个.c文件,得到.o的目标文件; 将每一个.o的目标文件链接成一个可执行的文件;
gcc常用选项 选项 -c 含义 仅对源文件进行编译,不链接生成可执行文件。在 对源文件进行查错时,或只需产生目标文件时可以 使用该选项。 在可执行文件中加入调试信息,方便进行程序的调 试。如果使用中括号中的选项,表示加入gdb扩展 的调试信息,方便使用gdb来进行调试 对生成的代码使用优化,中括号中的部分为优化级 别,缺省的情况为2级优化,0为不进行优化。注意, 采用更高级的优化并不一定得到效率更高的代码。
一个Makefile文件主要含有一系列的规则,每条规则 包含以下内容。 一个目标(target),即make最终需要创建的文件, 如可执行文件和目标文件;目标也可以是要执行的动作, 如“clean”。
一个或多个依赖文件(dependency)列表,通常是编 译目标文件所需要的其他文件。
一系列命今(command),是make执行的动作,通常是 把指定的相关文件编译成目标文件的编译命令,每个命令 占一行,且每个命令行的起始字符必须为TAB字符。 Makefile文件的一般格式是: 目标:依赖项列表 (Tab缩进)命令
-g[gdb]
-O[0、1、2、3]
将名为name的宏定义为definition,如果中括号中 Dna常用选项
linux4
实验(实习)名称常用命令使用实验(实习)日期指导教师专业年级班次姓名学号得分一、实验目的1.掌握C语言编译的基本用法。
2.掌握gdb调试工具的基本用法。
3.理解make工具的功能,学会编制makefile的方法。
二、实验内容1.利用gcc编译C语言程序,使用不同选项,观察并分析显示结果。
2.用gdb调试一个编译后的C语言程序。
3.编写一个有多文件构成的C语言程序,编写makefile,运行make工具进行维护。
三、主要实验步骤1.改写例6.1,使用下列选项对它进行编译:-I,-D,-E,-c,-o,-l。
2.完成对思考题6.5的调试。
#include<stdio.h>#include<stdlib.h>#include<string.h>int main(int argc,char **argv){char *p;int i;p=malloc(60);strcpy(p,"not 30 bytes");printf("p=<%s>\n",p);if(argc==2){if(strcmp(argv[1],"-b")==0)p[0]='a';else if(strcmp(argv[1],"-f")==0){p[0]='b';}}printf("p=<%s>\n",p);free(p);return 0;}运行结果如下:[LinyunGu@localhost subdir]$ ./badprog -bp=<not 30 bytes>p=<aot 30 bytes>[LinyunGu@localhost subdir]$ ./badprog -fp=<not 30 bytes>p=<bot 30 bytes>3.完成对思考题6.6的调试。
实验四Linux系统搭建C语言编程环境
实验四Linux系统搭建C语⾔编程环境实验四 Linux系统搭建C语⾔编程环境项⽬内容这个作业属于哪个课程< >这个作业的要求在哪⾥<>学号-姓名<17043101-李绍斌>作业学习⽬标1.了解Linux系统C语⾔编程环境;2.学习Linux环境C语⾔开发步骤1.安装C语⾔开发环境查看gcc版本信息查看make版本2.简单C语⾔练习1)通过man查看gcc2)命令⾏模式简单C语⾔编译链接等操作我们可以通过vim编辑器编写⼀个最简单的C语⾔程序,如写⼀个输出⾃⼰学号的程序。
先创建⼀个⽂件夹,然后进⼊该新创建的⽂件夹。
输⼊完了源程序,接下来我们进⾏C语⾔程序编译的四个阶段,预编译,编译,汇编,链接。
a) 预编译b)****编译c) 汇编反汇编d)****链接可执⾏⽂件是⼆进制⽂件,同样需要⽤objdump命令来反汇编该⽂件分析⽂件内容e)****运⾏3)****多⽂件编译在E3101⽂件夹下⾯再建⼀个⽂件夹mfc(multi-files compile)在该⽂件夹下⾯创建5个⽂件,⽂件名分别如下:每个⽂件的内容分别如下:完成上⾯的代码输⼊,接下来我们进⾏编译,对于多⽂件编译,我们可以⼀次编译链接⽣成可执⾏⽂件,也可以分别编译每个C⽂件,最后再进⾏链接得到可执⾏⽂件。
问:请说明两种⽅法的区别?答:第⼀种没有⽣成⽬标⽂件,第⼆种⽣成了⽬标⽂件。
接下来编写⼀个简单的Makefile,通过make⼯具帮助我们进⾏编译。
在当前⽂件夹编写⼀个Makefile⽂件现在可以直接在终端输⼊make就可以进⾏编译链接操作。
linux下c语言使用编译与调试试验
实验四:LINUX 下C语言使用、编译与调试实验一、目的:1、练习并掌握Linux提供的vi编辑器来编译C程序2、学会利用gcc、gdb编译、调试C程序3、学会使用make工具二、内容1、编写C语言程序,用gcc编译并观察编译后的结果,运行生成的可执行文件。
2、利用gdb调试程序。
3、学习编写makefile,并进行编译。
三、操作1、文件编辑器vi进入vi,直接执行vi编辑程序。
例:# vitest.c显示器出现vi的编辑窗口,同时vi会将文件复制一份至缓冲区(buffer)。
vi先对缓冲区的文件进行编辑,保留在磁盘中的文件则不变。
编辑完成后,使用者可决定是否要取代原来旧有的文件。
1) vi的工作模式(1)输入模式输入以下命令即可进入vi输入模式:a 在光标之后加入资料A 在该行之末加入资料i 在光标之前加入资料I 在该行之首加入资料o 新增一行于该行之下O 新增一行于该行之上(2)命令模式在输入模式下,按ESC可切换到命令模式。
命令模式下,可选用下列指令离开vi::q! 离开vi,并放弃刚在缓冲区内编辑的内容:wq 将缓冲区内的资料写入磁盘中,并离开viZZ 同wq:x 同wq:w 将缓冲区内的资料写入磁盘中,但并不离开vi:q 离开vi,若文件被修改过,则要被要求确认是否放弃修改的内容,此指令可与:w配合使用(3)命令模式下光标的移动h 左移一个字符j 下移一个字符k 上移一个字符l 右移一个字符0(零)移至该行的行首$ 移至该行的行尾^ 移至该行的第一个字符处H 移至窗口的第一行M 移至窗口中间那一行L 移至窗口的最后一行G 移至该文件的最后一行W, w 下一个单词(W 忽略符号)B, b 上一个单词(B 忽略符号)(4) 命令模式下的编辑命令dd 删除当前光标所在行yy 复制当前光标所在行p 将复制的内容粘贴在光标所在的位置后P 将复制的内容粘贴在光标所在的位置前x 删除当前光标字符X 删除当前光标之前字符u 撤消·重做2、GNU C编译器1) 使用gcc通常后跟一些选项和文件名来使用gcc编译器。
C语言在Linux环境编程
C语言在Linux环境编程C语言是一种广泛使用的编程语言,而Linux作为一种开源的操作系统,提供了强大的开发环境和工具,使得C语言在Linux环境下编程成为了广大开发者的首选。
本文将探讨C语言在Linux环境下的编程特点及常用技巧。
一、Linux环境下的C语言开发工具在Linux环境下,开发者可以使用多种工具进行C语言的编程和调试。
其中,最常用的是gcc编译器和gdb调试器。
gcc是GNU Compiler Collection的缩写,它是一套基于GNU计划的开源编译器套件,支持多种编程语言,包括C语言。
gdb是GNU Debugger的缩写,它是一个功能强大的调试器,可以帮助开发者定位和修复程序的错误。
二、C语言在Linux环境下的编写风格在Linux环境下编写C语言程序时,程序员通常采用一些特定的编写风格和规范,以便提高代码的可读性和可维护性。
以下是一些常用的编写风格:1. 缩进:使用适当的缩进来使代码结构清晰,建议使用4个空格或一个制表符进行缩进。
2. 命名规范:变量、函数和常量的命名应具有一定的描述性,遵循驼峰命名法或下划线命名法。
3. 注释:在代码中添加必要的注释,解释代码的作用和设计意图,以便其他人能够理解和维护代码。
4. 模块化:将程序分解为多个小模块,每个模块负责一个特定的功能,提高代码的可复用性和可测试性。
三、Linux环境下的C语言编译与运行在Linux环境下,通过gcc编译器可以将C语言源代码编译成可执行文件。
编译C语言程序的基本命令是:gcc source.c -o output其中,source.c是源代码文件的名称,-o是选项,用于指定生成的可执行文件的名称,output是可执行文件的名称。
编译成功后,可以使用以下命令来运行程序:./output四、Linux环境下的C语言调试在Linux环境下,使用gdb调试器可以帮助开发者定位和修复程序的错误。
以下是一些常用的调试技巧:1. 加入调试信息:在编译时,可以使用-g选项来生成包含调试信息的可执行文件,以便在调试过程中更容易定位错误。
Linux环境下 C语言编程实验报告
西安邮电大学(计算机学院)课内实验报告实验名称: Linux环境下 C语言编程专业名称:网络工程班级:1203班学生姓名:学号(8位):指导教师:王亚刚实验日期:2014年12月3日一、实验目的(2)掌握gcc编译器使用方法。
(3)掌握gdb调试方法。
二、实验内容1.编辑测试源代码。
2. gcc编译测试源代码3. gdb调试和排错。
三、实验步骤1.编辑如下参考源代码,代码的原意为倒序输出main函数中定义的字符串#include <stdio.h>int display1(char *string);int display2(char *string);p iint main (){char string[] = "nnWelcom to Linux";display1 (string); display2 (string);}int display1 (char *string){printf ("The original string is %s \n", string);}int display2 (char *string1){char *string2;int size,i;size = strlen (string1);string2 = (char *) malloc (size + 1);for (i = 0; i < size; i++)string2[size - i] = string1[i];string2[size+1] = ' ';printf("The string afterward is %s\n",string2);}2.使用gcc将参考源代码编译为可执行文件。
3.运行可执行文件,观察运行结果并记录。
4.使用gdb调试程序,通过设置断点、单步跟踪,找出错误原因并记录。
实验四 Linux下的C语言编程
实验四L i n u x下的C语言编程四、实验内容本实验要求在 LINUX/UNIX 环境下用 C 语言编写三个具体的 SHELL 命令,基本涉及了 LINUX/UNIX 文件系统中较为常用的有关文件操作的系统调用。
内容如下:1、编程实现 copy 命令。
执行格式:copy file1file2file3功能:将 file1、file2 两文件的内容合并拷入 file3 中,其中间应有 30个字节的空洞(调试成功后可将空洞调大到几十MB)。
程序执行后用 du 命令显示其占用磁盘空间,观察其大小,分析原因。
程序可能涉及到的系统调用: read(), write(), open(), creat(),close(), lseek()#include <sys/>#include <sys/>#include <>#include <>#include <>#include <>#include <>int main(int argc, char const *argv[]){int file1,file2,file3;if (argc!= 4) {printf("Usage: copy file1 file2 file3\n");exit(1);}file1=open(argv[1],O_RDONLY);file2=open(argv[2],O_RDONLY);file3=open(argv[3],O_CREAT|O_RDWR,S_IRWXU);int n;char buf[1024];while (( n=read(file1,buf,1024))>0)if (write(file3,buf,n)!=n)printf("write error\n");if (n<0)printf("read %s error\nErrno= %d\n",argv[1],errno);if (lseek(file3,30,SEEK_END)==-1)printf("lseek error ");while (( n=read(file2,buf,1024))>0)if (write(file3,buf,n)!=n)printf("write error\n");if (n<0)printf("read %s error\nErrno= %d\n",argv[2],errno);exit(0);close(file1);close(file2);close(file3);printf("success\n");return 0;}2、编程实现 renam(即 LINUX 下的 rename)命令,功能是实现文件的重命名。
Linux 环境下的C语言编程
command2
[…]
4.Make
例如: 下面三个文件,add.h用于声明add函数,add.c提 供两个整数相加的函数体,而main.c中调用add函数:
/* filename:add.h */ extern int add(int i, int j);
/* filename:add.c */ int add(int i, int j) {
用emacs打开的Hello.c的汇编代码
2.GCC编译器-常用选项
E选项:指示编译器仅对输入文件进行预处理,但不汇编和连接 O(-O1)选项:告诉GCC对源代码进行基本优化从而使得程序
执行地更快;而-O2选项告诉GCC产生尽可能小和尽可能快的代 码。使用-O2选项编译的速度比使用-O时慢,但产生的代码执行 速度会更快。 Wall 选项:显示附加的警告信息。例如在上述程序中去掉 return 0;语句,之后重新编译 gcc –Wall –o hello hello.c
3. GDB 调试器
举例说明怎样用GDB调试一个求0+1+2+3+…+99的程序: /* Filename:sum.c */ main() { int i, sum; sum = 0; for (i = 0; i < 100; i++) { sum + = i; } printf("the sum of 1+2+...+ is %d", sum); }
return i + j; }
/* filename:main.c */ #include "add.h" main() {
int a, b; a = 2; b = 3; printf("the sum of a+b is %d", add(a + b));
实验4 Linux程序开发基础
实验4 Linux程序开发基础一、实验目的:1.继续熟悉Linux终端命令;2.继续学习使用Vi编辑器;3.学习使用Linux环境下C语言程序的编译。
4.调试器Gdb的使用二、实验要求:完成实验内容并写出实验报告,报告应具有以下内容:1.实验目的。
2.实验内容。
3.实验过程、实验结果截屏。
4.实验过程中出现的问题及解决方法。
5.实验体会。
三、实验内容:1.使用Vi文本编辑器编写c语言程序。
2.学习使用C编译程序gcc3.使用调试器Gdb来调试程序四、实验步骤:1、以超级用户root登录系统,以自己名字新建一个用户,并用该用户重新登录系统。
2、创建C语言文件:使用vi编辑器在各自的目录下创建一简单C语言程序(文件名为first,扩展名为.c),程序内容为在屏幕上打印一行英文,英文字母自定,要求每个同学不同。
(提示:C语言中打印命令为printf)3、编译C语言程序:要求掌握Linux中最常用的C编译程序gcc的使用。
命令:gcc命令格式:gcc 【选项】文件列表该命令用于调用C编译系统。
当命令执行后,它依次进行预处理,编译,汇编,链接,最后产生可执行代码。
默认情况下,可执行代码放在a.out文件中。
例:gcc first.c//对文件first.c进行编译,编译通过后的话没有任何显示,产生默认的可执行文件a.out(用ls命令可以查看到该文件,该文件显示为绿色)。
可执行文件可以直接在提示符后输入文件名运行。
如:#a.out 回车将显示结果编译没有通过的话将显示出错的行数和信息。
gcc first.c –o hello//gcc命令带上选项–o表示对文件first.c进行编译,编译通过后,将可执行代码存放在指定的文件hello中(hello名字由用户定)。
现要求每个同学使用gcc对自己所编写的first.c程序进行编译并执行。
所产生的可执行文件命名为hello。
如果可执行文件不能直接运行,在可执行文件前加上. /,表示当前目录的意思4、编写如下c语言程序,使用循环语句从1加到100,并练习调试器Gdb的使用(设置断点并单步调试)调试器Gdb的用法:Linux系统中标准调试器是gdb,它可用来调试C、C++、Java等程序。
linux下c程序的编写实验报告
linux下c程序的编写实验报告实验主题:在Linux下编写C程序的实验报告一、引言(150-200字)Linux是一种广泛应用的操作系统,具有高度开放性和灵活性,也是许多程序员首选的开发环境。
在Linux中,通过编写C程序可以实现各种应用和功能。
本实验旨在通过一步一步的说明和回答,介绍在Linux下编写C 程序的基本步骤和方法。
二、实验步骤(400-500字)1. 设置编程环境在Linux中编写C程序,首先需要安装相关的开发工具和编译器。
常用的编译器有gcc和clang,可以通过包管理器进行安装。
同时,也需要一个文本编辑器来编写C代码,比如vim或者emacs。
2. 编写Hello World程序Hello World程序是C语言学习的经典入门程序,它可以在屏幕上输出"Hello World"。
在文本编辑器中新建一个文件,命名为hello.c,然后在文件中输入以下代码:#include <stdio.h>int main() {printf("Hello World\n");return 0;}保存文件后,使用gcc编译器将该文件编译成可执行文件。
在终端中执行以下命令:gcc -o hello hello.c此时会生成一个名为hello的可执行文件。
通过执行该文件,可以在终端中看到输出结果"Hello World"。
3. 命令行参数和用户输入C程序可以接受命令行参数和用户输入,从而实现更复杂的功能。
在上一步编写的程序的基础上,我们尝试接收用户输入的姓名,并输出相应的问候语。
在hello.c文件中添加以下代码段:#include <stdio.h>int main(int argc, char *argv[]) {char name[100];printf("Please enter your name: ");scanf("s", name);printf("Hello, s!\n", name);return 0;}重新编译程序并执行,可以看到在终端中会提示用户输入姓名,并输出相应的问候语。
