linux学习之路(三)

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

write和read函数详解
文件描述符

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 偏移量
whence

SEEK_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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值