Linux 基础
myod实验
1.实验要求
1.复习c语言文件系统内容;
2. 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能;
3. main与其他分开,制作静态库和动态库;
4. 编写Makefile;
5. 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息。
2.实验过程
1.代码过程
myod.c:
#include "head.h"
#include <stdio.h>
int main(){
char name[50];
printf("please input your txtname:");
scanf("%s",name);
asc(name);
hex(name);
return 0;
}
ascii.c:
#include "head.h"
#include <stdio.h>
void asc(char *name){
FILE *fp;
char ch;
fp = fopen(name,"r");
ch = fgetc(fp);
printf("the ascii:\n");
while(ch!=EOF){
if(ch=='\n')
printf("\n");
else
printf("%4d",ch);
ch = fgetc(fp);
}
fclose(fp);
}
hexacdecimal.c
#include "head.h"
#include <stdio.h>
void hex(char *name){
FILE *fp;
char ch;
fp = fopen(name,"r");
ch = fgetc(fp);
printf("the hexadecimal:\n");
while(ch!=EOF){
if(ch=='\n')
printf("\n");
else
printf("%4x",ch);
ch =fgetc(fp);
}
fclose(fp);
}
2.编译文件并运行
3.制作静态库
4.制作动态库
5.makefile
makefile文件:
odtest: myod.o ascii.o hex.o
gcc myod.o ascii.o hex.o -o odtest
myod.o: myod.c head.h
gcc -c myod.c -o myod.o
ascii.o: ascii.c head.h
gcc -c ascii.c -o ascii.o
hex.o: haxadecimal.c head.h
gcc -c haxadecimal.c -o hex.o
3.实验所需知识
Note:
- 文件系统 : c语言文件系统和文件指针使用c语言自带的文件系统库可以方便地打开系统中的文件,在fopen命令中,r为可读权限,w为可写权限,rw+为所有权限。文件输出结尾为EOF。
- od命令:od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。
- od -tx -tc xxx:-tx是以十六进制输出文件内容,默认为四字节成一组;-tx则是输出字节所对应的ascll值,
tips:
- 命令格式:
od [<选项><参数>] [<文件名>]
- 命令选项:
a:具名字符;
c:ASCII字符或者反斜杠;
d[SIZE]:十进制,正负数都包含,SIZE字节组成一个十进制整数;
f[SIZE]:浮点,SIZE字节组成一个浮点数;
o[SIZE]:八进制,SIZE字节组成一个八进制数;
u[SIZE]:无符号十进制,只包含正数,SIZE字节组成一个无符号十进制整数;
x[SIZE]:十六进制,SIZE字节为单位以十六进制输出,即输出时一列包含SIZE字节。在默认条件下,以四个字节为一组输出
4.遇到的问题
①在链接生成动态库时,已知有两种办法,一是将自己的so文件加入到系统库文件中去,二是用export LIBRARY指令为文件手动指引函数库。问题发生在我不想每次代码都要改动系统文件,手动指引函数库还是无法正确使得可执行程序。这时我发现gcc -g可以成功将动态库与主函数链接起来并执行,但是没有找到这其中的原因。希望老师和知道这个原因的同学来解答。
②在调试函数时,cgbd调试中每次执行到键入变量值信息的时候就会挑不出输出,换成gdb后便可以,百度时说在titty模式下才可输值,但是转变模式之后也不成功,希望老师和知道这个原因的同学来解答。