makefile_1 编写
makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接-----但是不是所有的文件都需要重新编译,makefile能够纪录文件的信息,决定在链接的时候需要重新编译哪些文件!
makefile命名规则:
1.makefile
2.Makefile
makefile的三要素:
1.目标
2.依赖
3.规则命令
写法:
目标:依赖
tab键 规则命令
第一版makefile
如果更改其中一个文件,所有的源码都重新编译。可以考虑编译过程分解,先生成.o文件,然后使用.o文件得到结果。
此时如果更改其中一个文件,就会更改两个文件。
第二版makefile
可以定义变量ObjFile=main.o add.o sub.o div.o…
变量的使用:$ (ObjFiles),$ (变量名)
可以使用变量简化。
makefile的隐含规则:默认处理第一个目标。
函数:
wildcard 可以进行文件匹配
patsubst 内容的替换
makefile的变量:
1. @ 代 表 目 标 2. @ 代表目标 2. @代表目标2.^ 代表全部依赖
3. $< 第一个依赖
4. $? 第一个变化的依赖。
makefile编写_2
终极makefile
@在规则前代表不输出该条规则的命令
规则前的“-”代表该条规则报错,仍然继续执行。
增加清理目标。
假如在make时候遇见这种,可以定义伪目标。
默认make命令是make makefile文件,可以使用参数指定makefile文件
make -f makefile1
gdb调试_1
使用gdb,编译的时候加-g参数
gcc func.c main.c -o app -I ./ -g
启动gdb: gdb app(对应可执行程序名)
在gdb启动程序:
r(un) 启动
start 启动 停留在main函数,分布调试。
n(ext) 下一条指令
s(tep) 下一条指令,可以进入函数内部,库函数不能进。
q(uit) 退出qdb
设置启动参数 set args 10 6
设置断点
b 行号 —默认是主函数所在文件的行
b 函数名
b 文件名:行号
l(ist) 查看代码 默认显示10行,默认显示主函数所对应的文件
l 文件名:行号
删除断点,d(el) 编号
查看断点i(nfo) b,得到编号。
c(ontinue) 调到下一断点
p(rint) 打印变量的值
ptype 打印变量的类型
set 设置变量的值set argc=4
set argv[1]=“12”
set argv[2]=“7”
dispaly 显示变量的值,用于追踪,查看变量具体什么时候变化
undisplay 删除显示变量,查看编号,info display
设置条件断点 b line if i==1
gdb调试_3
系统api与库函数的关系
文件IO
open
查看man 2 open
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
pathname 文件名
flags必选项
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写可选项
O_APPEND 追加
O_CREAT 创建文件O_EXCL与O_CREAT一起使用,如果文件存在,则报错。
mode权限位,最终(mode &~umask)O_NONBLOCK 非阻塞
返回值 成功返回最小的可用文件描述符。失败返回-1,设置errno
close
int close(int fd);
fd open 打开的文件描述符
返回值:成功返回0,失败返回-1,设置errno
read
ssize_t read(int fd,void *buf,size_t count);
fd 文件描述符
buf 缓冲区
count 缓冲区大小
返回值:失败返回-1,设置errno
成功返回读到的大小
0代表读到文件末尾
非阻塞情况下read返回-1.但是此时需要判断errno的值。
write
ssize_t write(int fd,const void* buf,size_t count);
fd 文件描述符
buf 缓冲区
count 缓冲区大小
返回值:成功,返回写入的字节数
失败,返回-1,设置errno
0 ,代表未写入
lseek实现文件读写位置改变
需求:打开一个文件,写入内容,helloworld,然后读取一下该文件的内容,输出到屏幕。
lseek移动文件读写位置
off_t lseek(int fd,off_t offset,int whence);
fd 文件描述符
offset 偏移量
whenceSEEK_SET 文件开始位置
SEEK_CUR 当前位置
SEEK_END 结尾返回值:
成功:返回当前位置到开始的长度
失败:返回-1,设置errno
lseek的作用:
移动文件读写位置
计算文件大小
拓展文件
拓展文件功能实现
阻塞的概念:
read函数在读设备或者读管道,或者读网络的时候,输入输出设备对应/dev/tty
#include<stdio.h>
#include <unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
int main(int argc,char *argv[]){
int fd=open("/dev/tty",O_RDWR);
char buf[256];
int ret=0;
while(1){
ret=read(fd,buf,sizeof(buf));
if(ret){
printf("buf is %s\n",buf);
}
printf("haha\n");
}
close(fd);
return 0;
}
fcntl函数设置非阻塞
#include<stdio.h>
#include <unistd.h>
#include<stdlib.h>
#include<fcntl.h>
#include<string.h>
#include<sys/types.h>
int main(int argc,char *argv[]){
//int fd=open("/dev/tty",O_RDWR|O_NONBLOCK);
int fd=open("/dev/tty",O_RDWR);
//fcntl()函数,设置非阻塞。
int flags=fcntl(fd,F_GETFL);
flags |=O_NONBLOCK;
fcntl(fd,F_SETFL,flags);
char buf[256];
int ret=0;
while(1){
ret=read(fd,buf,sizeof(buf));
if(ret<0){
perror("read err:");
printf("ret is %d\n",ret);
}
if(ret){
printf("buf is %s\n",buf);
}
printf("haha\n");
sleep(1);
}
close(fd);
return 0;
}