GNU/Make(一)——以一个质数判断程序为例

从CVE-2002-20001入门安全研究:Diffie-Hellman协议资源管理漏洞复现指南 Diffie-Hellman密钥交换协议是网络安全通信的基石,它允许双方在不安全的信道上协商共享密钥。其核心原理基于离散对数难题,通过交换公开参数并混合私有随机数生成共同密钥。在工程实现中,协议解析模块的资源管理至关重要,若缺乏对输入参数的严格边界校验,可能导致内存耗尽或CPU资源被过度消耗,从而引发拒绝服务漏洞。这类资源管理错误在早期的网络服务软件中较为典型,常因直接信任客户端传入的长度字段所致。理解此类漏洞有助于掌握安全编码的基本规范,并为分析更复杂的缓冲区溢出等内存安全问题奠定基础。本文以CVE-20 阅读详情

前言

本文从编译一个简单的质数判断程序入手, 介绍了如何利用GNU/Make方便地编译较复杂的程序项目。

背景

目标

如果我们希望用C语言实现判断一个从外部输入的正整数a是否是质数的程序(要求a小于一预设值intmax),那么我们需要在程序中实现以下功能:

  • 读取外部输入a,并判断a是否为整数且小于intmax;

  • 求不大于a的平方根的正整数b;

  • 判断是否存在小于等于b且不等于1的整数c能整除a。若存在,则a为合数,否则为质数。

实现

上述功能由三个函数实现,分别保存在三个.c文件中,由main.c中main()统一调用。各函数功能见表格,具体代码见最后一节附录。通过编译.c产生.o文件,然后将所有.o链接起来,产生可执行程序prime。注意到这里需要math.h中的函数sqrt,因此需要用-lm链接数学库。

文件名函数名形参功能返回值
main.cmain 流程控制 
read_a.cread_a 从外部读取aa; -1
isqrt.cisqrta求不大于a−−√a的整数b 
judge_p.cjudge_pa,b循环判断a是否质数 
prime.h  头文件, 声明函数

GNU/Make基本

什么是make

比较大的工程通常包含很多源文件,需要逐个编译并链接才能得到目标执行程序。手动编译和链接不仅操作麻烦,每次链接时还要重新输入所有目标文件以及需要的函数库,浪费时间精力。make是一种帮助我们自动编译与构建大型工程的工具。通过将规则(rule)写入Makefile文件,make就会根据规则中的依赖关系逐层编译目标文件,最后链接得到执行程序。make在Linux上的标准实现是GNU/Make,以下所有make指令均为GNU make。

事实上,除了编译程序外,make也可以帮助我们完成其他的工作,具体内容由规则决定。

规则

make需要Makefile来告诉它以什么样的顺序去编译和链接程序。Makefile中最核心的概念是规则,一个Makefile里可以包含多个规则。规则一般写成如下形式

1
2
3
4
[目标文件]: [前提文件]
    [命令 1]
    ...
    [命令 n]

其中

  • 目标文件(Target)可以是一个.o文件,或者可执行程序,也可以仅仅是一个标签(比如clean目标是清除所以已编译的.o文件和可执行程序)。
  • 前提文件(Prerequisites)是完成该目标所需要的文件或者目标。目标文件和前提文件之间用冒号分开。命令(Command)为该目标下执行的Shell命令,必须用Tab对命令缩进。这一系列命令统一称为规则的recipe。如果你不喜欢用Tab缩进,那么需要修改.RECIPEPREFIX换成你想要的符号。比如

    1
    2
    3
    
    .RECIPEPREFIX := :
    all:
    :@echo "Recipe prefix symbol set to $(.RECIPEREFIX)"
    

make运行机制

在命令行输入make后,一般会按次序发生以下事件:

  1. make在当前文件夹下搜索Makefile和makefile(GNU make还会包括GNUmakefile)文件并读取。搜寻顺序是GNUmakefile、makefile、Makefile,先找到哪个文件读哪个;

  2. 找到Makefile后,读取Makefile中include包含的文件;

  3. 初始化变量值,展开所有需要立即展开的变量;

  4. 以第一个规则中的目标作为最终目标,根据最终目标以及依赖关系,建立依赖关系列表;

  5. 执行除最终目标以外的所有目标的规则:规则中前提文件不存在,或者前提文件比目标文件新,则执行规则下的命令重建目标;

  6. 执行最终目标所在规则。

Makefile具体写法

接下来以构造可执行程序prime为例,讲解Makefile的写法和make的运行。

最直接的Makefile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
prime: read_a.o isqrt.o judge_p.o main.o 
    gcc -o prime read_a.o isqrt.o main.o judge_p.o -lm

read_a.o: read_a.c
    gcc -c read.c

isqrt.o: isqrt.c
    gcc -c isqrt.c

judge_p.o: judge_p.c
    gcc -c judge_p.c

main.o: main.c
    gcc -c main.c

clean:
    rm -f prime read_a.o isqrt.o judge_p.o  main.o

此时在命令行输入

1
$ make

即可编译所有.o文件和prime。基本流程是:

  1. 确定最终目标”prime”,确认前提文件.o是否存在;

  2. 初始时.o文件均未编译,因此make搜寻以read.o为目标的规则。这一规则只依赖于read_a.c,而read_a.c存在,因而执行该规则内的指令gcc -c read_a.c, 编译得到read_a.o;

  3. 同上,编译isqrt.o, judge_p.o和main.o;

  4. .o全部编译完成后,回到prime目标执行链接的命令,产生可执行程序prime。

注意,make只会执行第一个规则,如果把prime放到后面,那么make将只会编译read_a.c,此时需要输入

1
$ make prime

在make后加上-d选项,可以查看make运行的具体流程

1
$ make -d

改进Makefile

定义显式变量

在Makefile中定义变量objects

1
objects = read_a.o isqrt.o judge_p.o main.o

用$()展开objects可以得到所有目标。

利用预定义隐式规则

make对一系列程序的编译预定义了隐式规则,例如C程序编译的隐式规则为

1
$(CC) -c main.c $(CFLAGS) $(CPPFLAGS)

且自动包含.c文件为前提文件。其中CC,CFLAGS和CPPFLAGS是make针对C程序编译的内建变量,其他的还有CXX,FC,FFLAGS,LDFLAGS等等。因此Makefile可以进一步简化为

1
2
3
4
5
6
7
8
objects = read_a.o isqrt.o judge_p.o main.o 

prime: $(objects) 
    gcc -o prime $(objects) -lm

.PHONY: clean
clean:
    rm -f prime $(objects)

事实上在main.o中我们省去了prime.h,这是因为它被包含在main.c中,make会将其自动加入前提文件。从而显式规则只剩下以prime和clean为目标的规则。

这里用.PHONY声明伪规则(Phony rules),里面包含clean,以避免执行make时以clean作为最终目标。在这里并不是必要的,因为第一个目标是prime。但当工程较大、规则较多较杂时,声明伪规则可以避免不必要的问题。

修改内置变量

CC,CFLAGS,CXX,FC,FFLAGS,LDFLAGS等等是make中内置的变量,在隐式规则中使用。我们同样可以修改它们,配合%匹配来自定义程序编译的隐式规则。例如在makefile.include里面定义

1
2
3
CC = icc
CFLAGS = -Wall -g
LDFLAGS = -lm

此时.o文件的隐式规则中执行的命令实际就变成了

1
icc -c -o main.o main.c -Wall -g

在目标prime的规则中,用$(LDFLAGS)变量来包含数学库,编译器$CC

1
2
prime:
	$(CC) -o prime $(objects) $(CFLAGS) $(LDFLAGS)

模式规则

我们看到对于.o文件我们可以利用隐式规则来编译,但是当我们需要使用比较复杂的编译选项时,隐式规则就不适用了。此时可以利用%进行模式匹配来定义隐式规则,如prime.h在include文件夹内,需要用-I选项将该文件夹加入头文件搜索路径

1
2
3
INC= -I./include
%.o: %.c
    $(CC) -c -o $@ $< $(CFLAGS) $(INC)

其中%.o: %.c等价于以stem.c为前提产生目标文件stem.o。这样的规则称为模式规则(Pattern
rule)。我们可以用这种方法自定义执行命令,使之符合我们的需求。

自动变量

上面的命令中用到的$@和$<是make的一个特殊功能,称为自动变量(automatic variable)。make中常用的自动变量见下表

自动变量含义
$@目标文件名
$<第一个前提文件的名字
$^所有前提文件,以空格分隔
$?所有比目标文件新的前提文件,以空格分隔

通配符

包括一般的Shell通配符, 如*,?,[],[!]。例如clean目标中

1
2
clean:
	rm -f prime *.o

此外更为常用的通配符是wildcard和patsubst函数. 使用wildcard函数扩展通配符以及patsubst函数替换通配符。patsubst需要3个参数,第一个是个需要匹配的式样,第二个表示用什么来替换它,第三个是个需要被处理的由空格分隔的字列。以下objects定义的方法与显式定义等价

1
2
sources = $(wildcard *.c)
objects = $(patsubst %.c,%.o,$(sources))

 

第一个%匹配非空字符串,每次匹配的字符串叫做”柄”(stem),第二个%将被解读为第一参数所匹配的柄。该命令中,patsubst将$(sources)中的.c文件列表替换成对应的.o文件。这里的%不能用*来代替。

include外部文件

创建makefile.include文件,在里面定义变量:

1
2
3
4
5
6
7
# makefile.include 
sources = $(wildcard *.c)
objects = $(patsubst %.c,%.o,$(sources))
CC      = icc
CFLAGS  = -Wall -g
LDFLAGS = -lm
INC     = -I./include

 

在Makefile里加入include指令把makefile.include中的变量包含进来。此时Makefile写成

1
2
3
4
5
6
7
8
9
10
11
include makefile.include 
    
prime: $(objects) 
	$(CC) -o prime $(objects) $(CFLAGS) $(LDFLAGS)
    
%.o: %.c
	$(CC) -c -o $@ $< $(CFLAGS) $(INC)
    
.PHONY: clean
clean:
	rm -f prime *.o

 

条件语法

make支持条件控制ifeq..else..endif,例如

1
2
3
4
5
6
debug=no
ifeq ($(debug),no)
    CFLAGS += -O3
else
    CFLAGS += -O0
endif

 

直接用make编译时将默认执行激进的O3优化。可在命令行增加宏debug定义来覆盖Makefile里定义好的值,如

1
$ make debug=yes

 

此时不会对程序进行优化。这样方便随时调试和比较优化带来的效率改进。

附录

代码附录

main.c

1
2
3
4
5
6
7
8
9
10
11
/* decide if an integer a is a prime number */
#include "prime.h"
    
int main()
{
    int a,b;
    a = read_a();
    b = isqrt(a);
    judge_p(a,b);
    return 0;
}

read_a.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "prime.h"
#define intmax 100
int read_a()
{
    int a;
    printf(" Type the number a (4<=a<%d): ",intmax);
    scanf("%d",&a);
    if (a < 4 || a > intmax)
    {
        printf("%d is not in range. Exit\n",a);
        exit(1);
    }
    else
        return a;
}

isqrt.c

1
2
3
4
5
6
7
#include "prime.h"    
int isqrt(int a)
{
    int t;
    t = sqrt(a);
    return t;
}

judge_p.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "prime.h"
void judge_p(int a, int a_sqrt)
{
    int i;
    for (i=2;i<=a_sqrt;i++)
    {
        if (a%i == 0)
        {
            printf(" %d is not prime.\n",a);
            break;
        }
    }
    if (i==(a_sqrt+1))
        printf(" %d is prime.\n",a);
}

prime.h

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#ifndef __FUNC_H
#define __FUNC_H
int read_a();
int isqrt(int a);
void judge_p(int a,int b);
#endif

TeX文件编译的Makefile举例

1
2
3
4
5
6
7
# 编译about_make.tex
FILE = about_make.tex
TEX  = xelatex
    
all:
	$(TEX) $(FILE);
	$(TEX) $(FILE); # 需要连续编译两次以获得交叉引用的编号

参考资料

GNU manual of make: https://www.gnu.org/software/make/manual/make.html

转自:http://shigaro.org/2017/10/12/make-1/#

VS2015配置NTL库实战:C++大整数运算与密码学开发环境搭建 在C++开发中,处理大整数运算和复杂数论计算是密码学、算法竞赛等领域的核心需求。标准C++内置整数类型在应对RSA加密、椭圆曲线计算或大质数生成时能力有限,因此需要借助专门的高精度数学库。NTL(Number Theory Library)作为一款高效的C++数论函数库,通过提供大整数(ZZ)、模运算(ZZ_p)、多项式等核心类,实现了高性能的数学计算。其技术价值在于为密码学协议实现、编码理论研究和科学计算提供了可靠的底层支持。在应用场景上,开发者常在需要大数运算的密码学工具、学术研究和工程项目中集成NTL 阅读详情

相关推荐

Python数论代数库cypari-2.2.0详解

本文还有配套的精品资源,点击获取 简介:cypari-2.2.0是一个基于C语言实现的PARI/GP库的Python接口,专为数论和代数计算设计。它提供了Python语法的高级数论和代数计算功能,同时降低了使用门槛并提高了开发效率。该库支持自动类型转换、丰富的API、性能优化和易用性,并通过文档提供使用支持。cypari的应用场景广泛,包括数论计算、代数几何、密码学和随机数...

weixin_42604188的博客 944

kernel module编程(六):printk-printf的debug

  本文包含《Linux Device Drivers》,即LDD3的第四章:Debugging Techniques的读书笔记之一,但我们不限于此内容。我在网上看到了LDD3的中文版:http://www.deansys.com/doc/ldd3/,我看了一下,最好和原文版一起阅读。  在我们的程序的调测中,无论是JAVA,C(kernel module或者是用户

愷风(Wei)的专栏 8001

GMP 6.1.2 高精度计算库 MinGW64编译x64版本实战应用

从MinGW64编译到C++现代化封装,我们走过了一条完整的工程化路径。GMP不是一个简单的“拿来即用”库,而是一个需要你深入理解其构建机制、内存模型和性能特性的强大伙伴。当你下次面对百万位大数运算时,不会再感到无助。因为你已经知道如何亲手打造一把锋利的武器,并用最优雅的方式挥舞它。所以,别再犹豫了——去下载GMP源码,动手编译一次,写个小程序验证它吧!只有亲自动手,才能真正拥有这份力量 💥。本文还有配套的精品资源,点击获取。

weixin_35756690的博客 1145

linux 屏蔽内核调试信息,[总结]内核调试开启关闭Debug功能 | 勤奋的小青蛙

通过定义宏来控制是否开启Debug.代码如下:#undef PDEBUG /* undef it, just in case */#ifdef SCULL_DEBUG# ifdef __KERNEL__/* This one if debugging is on, and kernel space */# define PDEBUG(fmt, args...) pr...

weixin_42121272的博客 3201

一个固定翼飞机仿真程序带你系统性上手如何实现配平(工具箱+脚本)

老规矩,该博客所用的模型和脚本已上传至百度网盘,名字为“固定翼配平训练例子”,自己自取。

zouxu634866的博客 2573

KEIL-MDK代码美化神器:AStyle配置全攻略(附常用参数详解)

本文详细介绍了如何在KEIL-MDK中配置和使用AStyle代码格式化工具,包括基础参数设置、高级格式控制、团队协作方案以及KEIL深度集成技巧。通过合理的AStyle配置,开发者可以显著提升代码风格一致性,优化团队协作效率,特别适合嵌入式开发项目。

weixin_30505225的博客 147

Linux篇一:Makefile写快速排序

菜鸟的进阶之旅从此开始。 老师给的第一个任务,如题 参考资料: ①《Linux程序设计第四版》——320页,Makefile举例 ②百度百科——快速排序,C语言版(不会调试,用于Linux编程),Java版(用于调试理解),而后理解并能笔算出快速排序每一轮排序的结果 查资料的过程中,看到有人推荐《跟我一起写Makefile》这书,我顺便也下了,以后看。 遇到的问题: ①C语言代码在c

Fatecare的博客 851

从代码学习深度强化学习 - 目标导向的强化学习-HER算法 PyTorch版

经典的深度强化学习算法,如 PPO、SAC 等,在各自擅长的任务中都取得了非常好的效果。但它们通常都局限在解决单个任务上,换句话说,训练好的算法,在运行时也只能完成一个特定的任务。想象一个场景:我们想让一个机械臂能把桌子上的任何一个物体重置到任意一个指定位置。对于传统强化学习而言,如果目标物体的初始位置和目标位置每次都变化,那么这就是一个全新的任务。即便任务的“格式”——抓取并移动——是一样的,但策略本身可能需要重新训练。这显然效率极低。为了解决这类问题,

weixin_43887510的博客 1502

质数的排列

请你帮忙给从 1 到 n 的数设计排列方案,使得所有的「质数」都应该被放在「质数索引」(索引从 1 开始)上;(即质数应该排在第质数位上,如3排在第1位就是不行的,3是质数而1不是) 需要返回可能的方案总数。 让我们一起来回顾一下「质数」:质数一定是大于 1 的,并且不能用两个小于它的正整数的乘积来表示。 由于答案可能会很大,所以请你返回答案 模 mod 10^9 + 7 之后的结果即可。...

qq_60740835的博客 475

变压器耦合放大器(低频应用+高频应用)

变压器耦合放大器(低频应用+高频应用)

m0_54943120的博客 2275

Electron多窗口开发避坑指南:Pinia状态同步的3种解决方案对比

本文深入探讨了在Electron多窗口应用中实现Pinia状态同步的三种核心方案。针对Electron多窗口架构下状态隔离的挑战,文章对比了基础事件通信、共享存储以及智能Pinia插件等方案的优劣与适用场景,并提供了生产级的实现指南与选型建议,帮助开发者构建健壮高效的桌面应用。

spice的博客 479

Linux Makefile ifeq正确使用

今晚和昨晚捣鼓了很久ifeq,按照书山所写的的

pk124729136的专栏 2万+

从零到一:使用阿里云百炼搭建企业级 AI Agent 完全实战手册(2026超详细版)

本文是一份企业级AI Agent构建手册,主要面向企业技术负责人、AI产品经理和后端开发工程师。手册详细介绍了如何在阿里云百炼平台上搭建企业智能体应用的全流程,包括环境准备、知识库构建、智能体创建、工具集成、工作流编排等核心环节。重点内容包括: 准备工作:阿里云账号注册、百炼服务开通、免费额度领取、API Key管理 知识库构建:文档格式要求、内容优化原则、RAG系统搭建 智能体开发:Agent创建、工具集成、复杂业务工作流设计 生产部署:多渠道接入、监控运维、安全治理 成本控制:Token预算管理、选型决

u010323587的专栏 1100

c语言如何编写建立tex文件夹,GNU/Make笔记(一)——编写Makefile

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?前言本文从编译一个简单的质数判断程序入手, 介绍了如何利用GNU/Make方便地编译较复杂的程序项目。背景目标如果我们希望用C语言实现判断一个从外部输入的正整数a是否是质数的程序(要求a小于一预设值intmax),那么我们需要在程序中实现以下功能:读取外部输入a,并判断a是否为整数且小于intmax;求不大于a的平方根的...

weixin_39583623的博客 640

解决用加速器以后,电脑无法连接网络的问题

相信很多朋友也遇到过,用加速器以后,电脑网络直接断了,或者访问外网时打不开的情况解决办法是。

qq_46368050的博客 1万+

让 AI 学会“慢思考”:MCP Sequential Thinking 深度部署与使用指南

摘要: MCP Sequential Thinking 是一种让AI具备"慢思考"能力的技术,通过动态调整思维路径解决复杂问题。本文详细介绍了在Windows、macOS和Linux系统下的部署方法,包括环境准备、配置文件修改等步骤。该技术通过"产生想法-评估需求-修正路径"的循环机制,显著提升AI在代码设计、数学证明等复杂任务中的表现。文章还提供了验证安装方法、使用示例和常见问题解答,帮助开发者解锁AI的深层思考能力。(149字)

weixin_43236925的博客 1913

Linux 系统编程技巧(二)

在这个示例中,我们将学习一些常见的 POSIX 标准,以及如何以及为什么使用它们,以及如何使用特性测试宏来指定它们。我们已经看到了几个例子,当我们包含了 POSIX 标准或一些特定的 C 标准时。例如,当我们使用getopt()时,我们在源代码文件的顶部定义了(来自第二章使您的程序易于脚本化特性测试宏控制了系统头文件中暴露的定义。我们可以以两种方式利用它。一种是通过使用特性测试宏来创建可移植的应用程序,从而防止我们使用非标准定义,另一种是相反,允许我们使用非标准定义。

龙哥盟 1211

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

2020年学习计划:1月底~5月底

1. 学习内容 2. 学习计划 - - - -2.1 linux 命令行工具 - - - -2.2 linux 端开发:必备工具 - - - -2.3 计算机科学与编程类经典书籍 3. 学习笔记 4. 学习总结 SMART-目标管理原则: specific-具体性 measurable-可度量 attainable-可实现 relevant-相关性 timebased-时限性 1 ...

Lemon刘羽飞 541

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

R语言包安装并实现与HANA的整合

1 R语言介绍        R语言是基于S语言的一个GNU计划项目,可以当成是S语言的一种实现,最初是由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发,主要用于统计分析,绘图,数据挖掘. SAP HANA SP5版本发布以来,将SAP HANA的内存计算和R丰富的统计功能进行了完美的结合,使得在SAP HANA数据库中可以使用R语言作为存

茄肥猫的窝 2271

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

sysbench进行pg测试

sysbench 是一款基于 LuaJIT 的可编写脚本的多线程基准测试工具。它最常用于数据库基准测试。CPU性能测试:通过质数计算或圆周率计算来评估CPU性能。内存性能测试:测试系统的内存分配及传输速度。磁盘IO性能测试:测试系统的磁盘读写速度。调度程序性能测试:评估操作系统的调度程序性能。POSIX线程性能测试:评估系统的线程处理能力。数据库性能测试(OLTP基准测试):通过模拟数据库操作来评估数据库性能,支持 MySQL、Oracle、PostgreSQL 等数据库。

shulu的专栏 938

AX650边缘AI芯片高效推理流水线实战:ax-pipeline核心原理与性能优化

在边缘计算和嵌入式AI应用场景中,模型推理流水线是提升系统吞吐量和降低延迟的关键技术。其核心原理在于将串行的数据处理环节(如预处理、推理、后处理)解耦为独立的阶段(Stage),通过共享内存或高效缓冲区实现数据流动,从而让CPU与NPU等计算单元并行工作,最大化硬件利用率。这项技术的核心价值在于能显著减少数据在CPU与专用加速器(如NPU)之间的冗余拷贝,降低内存带宽压力,尤其适合对实时性和功耗要求严苛的嵌入式视觉应用,例如智能安防、工业质检和自动驾驶感知系统。本文以热门的边缘AI芯片AX650及其配套的a

weixin_34319817的博客 391

现代C++学习路线图:从核心基础到工程实践的全方位指南

C++作为一门系统级编程语言,其核心价值在于提供对硬件资源的精细控制和极致性能。其设计哲学基于“零开销抽象”原则,允许开发者在保持高级抽象的同时,获得接近底层的执行效率。这一特性使C++在需要高性能和资源控制的场景中不可替代,如游戏引擎、高频交易系统、操作系统和嵌入式开发等。通过RAII(资源获取即初始化)等现代编程范式,C++实现了内存与资源的自动化管理,显著提升了代码的安全性与可靠性。智能指针作为RAII思想的典型实践,通过自动化的内存生命周期管理,有效防止了内存泄漏等常见问题。掌握这些现代C++特性,

keke1314520的博客 331

使用sysbench进行压力测试

sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL/Drizzle,它主要包括以下几种方式的测试: cpu性能 磁盘io性能 调度程序性能 内存分配及传输速度 POSIX线程性能 数据库性能(OLTP基准测试) 机器配置 [root@localhost ~...

weixin_33868027的博客 153

写给三弟的 C语言编程 快速入门

三弟,你要的C语言快速入门,已整理好 请接收。

码刀攻城 3938
上一篇: makefile中的all和.PHONY的作用
下一篇: VMware下的RHEL 6.4 安装gcc和gcc-c++
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值