一、题目
0. 每个*.c一个文件,每个*.h一个文件,文件名中最好有自己的学号
1. 用Vi输入图中代码,并用gcc编译通过
2. 在Vi中使用K查找printf的帮助文档
3. 提交vi编辑过程截图,要全屏,包含自己的学号信息
答案:
1、
2、
3、
二、题目
1. 用gcc 进行预处理,编译,汇编,链接vi输入的代码
2. 生成的可执行文件中要有自己的学号
3. 提交预处理,编译,汇编,链接,运行过程截图,要全屏,包含自己的学号信息
答案:
1、
2、
3、
三、
1. 用gcc -g编译vi输入的代码
2. 在main函数中设置一个行断点
3. 在main函数增加一个空循环,循环次数为自己学号后4位,设置一个约为学号一半的条件断点
4. 提交调试过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
答案:
1、
2、
3、
四、题目
1 复习c文件处理内容
2 编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能
3. main与其他分开,制作静态库和动态库
4. 编写Makefile
答案:
2、
od的功能:
od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示,通常用于显示或查看文件中不能直接显示在终端的字符。
选项-t:指定输出格式,格式包括a、c、d、f、o、u和x。
参数x[SIZE]:十六进制,SIZE字节为单位以十六进制输出。
od -tx XXX是以十六进制输出XXX的内容,默认以四字节为一组显示。(XXX中字符对应的ascii值的十六进制表示,且每四字节显示的顺序是字符从后向前的顺序)
程序如下:
执行结果:
五、题目
1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?
2. 提交静态库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
答案:
1、
2、
六、题目
1. 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?
2. 提交共享库生成和调用过程截图(一定包含条件断点的),要全屏,包含自己的学号信息
答案:
七、题目:
1 写出编译上面vi编辑代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.
2 提交Make过程截图,要全屏,包含自己的学号信息
答案:
1、
testmymath: main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o testmymath
main.o: main.c head.h
gcc -c main.c
add.o: add.c head.h
gcc -c add.c
sub.o: sub.c head.h
gcc -c sub.c
mul.o: mul.c head.h
gcc -c mul.c
div.o: div.c head.h
gcc -c div.c
2、
八、题目
1 参考教材第十章内容
2 用Linux IO相关系统调用编写myod.c 用myod XXX实现Linux下od -tx -tc XXX的功能,注意XXX是文件名,通过命令行传入,不要让用户输入文件名
3. 不要把代码都写入main函数中
4. 要分模块,不要把代码都写入一个.c中
5 提交测试代码和运行结果截图, 提交调试过程截图,要全屏,包含自己的学号信息
6 课上上传代码到码云
答案:
1、
2、伪代码
int main(传入文件信息){
打开文件
输出文件长度转为数字
for(循环到文件尾){
do{
输出文件内容
有换行则跳出
}while(文件结束)
}
关闭文件
}
3、
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char*argv[])
{
FILE *fp=fopen(argv[2],"r");
int i,j;
char ch;
j=atoi(argv[1]);
for(i=0;i<j;i++)
{
do{ ch=fgetc(fp);
putchar(ch);
if(ch == ' ') break;
}while(ch!=EOF);
}
fclose(fp);
}
九、题目
使用fork,exec,wait实现mybash - 写出伪代码,产品代码和测试代码 - 发表知识理解,实现过程和问题解决的博客
答案:
伪代码
int main(){
从终端读取要执行的命令
fork()产生子进程执行此命令
如果exec函数返回,表明没有正常执行命令,打印错误信息perro()
父进程, 等待子进程结束,并打印子进程的返回值wait(&rtn)
}
产品代码
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>
void main()
{
char *command[3];
command[0] = "ls";
command[1] = "-l";
command[2] = 0;
int s,i=0;
int rtn;
printf( ">" );
//printf("%s %s %s",command[1],command[2],command[3]);
printf("%s",command[0]);
i=0;
s=fork();
if ( s== 0 ) {
//printf("%d ",s);
execvp( command[0], command );
//perror( command );
exit( errno );
}
else {
//printf("%d ",s);
wait ( &rtn );
printf( " child process return %d ", rtn );
}
}