【Linux操作系统】探秘Linux奥秘:Linux开发工具的解密与实战

news2024/11/25 19:23:09

🌈个人主页:Sarapines Programmer
🔥 系列专栏:《操作系统实验室》
🔖诗赋清音:柳垂轻絮拂人衣,心随风舞梦飞。 山川湖海皆可涉,勇者征途逐星辉。

目录

🪐1 初识Linux OS

🪐2 Linux开发工具的解密与实战

🌍1. 实验目的

🌍2. 实验准备

🌍3. 实验内容

🌍4. 实验心得

📝总结


🪐1 初识Linux OS

Linux是一种开源的Unix-like操作系统内核,它是基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。Linux内核最初是由芬兰程序员Linus Torvalds在1991年创建的,之后成为自由软件和开源社区的一个主要项目。

以下是Linux操作系统的一些主要特点和组成部分:

  1. 内核(Kernel): Linux内核是操作系统的核心,它管理系统资源,如处理器、内存、设备驱动程序等。Linus Torvalds最初编写了Linux内核,它是Linux操作系统的基础。

  2. Shell(命令解释器): Linux操作系统使用命令行界面(CLI),用户与系统交互通过Shell。用户可以通过输入命令执行各种任务,管理文件、进程、权限等。常见的Shell包括Bash(Bourne Again SHell)和Zsh。

  3. 文件系统: Linux支持多种文件系统,包括Ext4、XFS、Btrfs等。文件系统负责管理存储设备上的文件和目录,以及文件的权限、所有权等信息。

  4. 用户界面: 虽然Linux以CLI为主,但也支持图形用户界面(GUI)。常见的Linux桌面环境有GNOME、KDE、XFCE等,它们提供了直观的用户体验。

  5. 软件包管理系统: 大多数Linux发行版都有自己的软件包管理系统,用于安装、更新和删除软件。常见的包管理工具有APT(Debian/Ubuntu)、YUM(Red Hat/CentOS)、Pacman(Arch Linux)等。

  6. 网络功能: Linux具有强大的网络功能,支持各种网络协议和服务。它可以作为服务器运行各种网络服务,如Web服务器(Apache、Nginx)、邮件服务器(Postfix、Sendmail)、文件服务器(Samba)等。

  7. 多用户和多任务: Linux是一个多用户系统,多个用户可以同时访问同一台机器。它也是一个多任务系统,可以同时运行多个进程。

  8. 安全性: Linux以安全性而闻名,系统管理员可以设置用户权限、访问控制列表(ACLs)等来确保系统的安全性。

  9. 开源和自由: Linux是开源软件,其源代码可以被任何人查看、修改和分发。大多数Linux发行版是免费提供的,用户可以自由选择、使用和分发。

  10. 发行版(Distribution): 由于Linux内核是开源的,不同的组织和社区创建了各种Linux发行版,例如Ubuntu、Debian、Fedora、CentOS、Arch Linux等。每个发行版都有自己的特点和包管理系统。

总体而言,Linux操作系统是一个强大、灵活且可定制的操作系统,广泛应用于服务器、嵌入式系统、超级计算机等各种领域。


🪐2 Linux开发工具的解密与实战

🌍1. 实验目的

  • 掌握gcc编译方法与使用;
  • 掌握Linux调试器GDB的使用;
  • 实践编译与调试技能,提升对软件开发环境的熟练度。

🌍2. 实验准备

  • 获取 Linux 镜 像文件:下载适用于虚拟机的 Linux 镜像文件,比如 Ubuntu 21.04,从 Ubuntu 官方网站 获取。

  • 安装虚拟化软件:安装 VMware Workstation 或 Virtualbox,两者提供简便的虚拟机管理和配置。

  • 创建 Linux 虚拟机:打开虚拟化软件,按照指引创建新虚拟机。设置内存为 2GB 或更多,其余选项选择 默认值。加载下载好的 Linux 系统 ISO 镜像文件,启动虚拟机完成 Linux 系统安装。


🌍3. 实验内容

1.编译器gcc的使用

(1)编辑一个C语言程序文件 hello.c ,代码如下:

#include <stdio.h>
main()
{
    char name[20];
    printf(“Please input your name :”);
    scanf(“% s”, name);
    printf(“Welcome % s !\n”, name);
    return 0;
}

(2)编译文件: gcc -o hello hello.c。

(3)若有错误,修改hello.c的内容,然后再次编译,直至没有错误为止。

解:

(1)编辑一个C语言程序文件 hello.c ,代码如下:

#include <stdio.h>
main()
{
    char name[20];
    printf(“Please input your name :”);
    scanf(“% s”, name);
    printf(“Welcome % s !\n”, name);
    return 0;
}

在终端输入vim hello.c,将示例代码输入到hello.c结果显示如下:

退出保存,文件夹多了hello.c文件夹

(2)编译文件: gcc -o hello hello.c。

(3)若有错误,修改hello.c的内容,然后再次编译,直至没有错误为止。

在终端输入gcc -o hello hello.c结果显示报错如下所示:

回到源码hello.c,我们根据报错信息分段分析。

第一段:

hello.c:2:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
    2 | main()
      | ^~~~
hello.c: In function ‘main’:
hello.c:5:10: error: stray ‘\342’ in program
    5 |   printf(���Please input your name:”);
      |          ^
hello.c:5:11: error: stray ‘\200’ in program
    5 |   printf(���Please input your name:”);
      |           ^
hello.c:5:12: error: stray ‘\234’ in program
    5 |   printf(��Please input your name:”);
      |            ^
hello.c:5:13: error: ‘Please’ undeclared (first use in this function)
    5 |   printf(“Please input your name:”);
      |             ^~~~~~
hello.c:5:13: note: each undeclared identifier is reported only once for each function it appears in
hello.c:5:19: error: expected ‘)’ before ‘input’
    5 |   printf(“Please input your name:”);
      |                   ^~~~~~
      |                   )
hello.c:5:36: error: stray ‘\342’ in program
    5 |   printf(“Please input your name:���);
      |                                    ^
hello.c:5:37: error: stray ‘\200’ in program
    5 |   printf(“Please input your name:���);
      |                                     ^
hello.c:5:38: error: stray ‘\235’ in program
    5 |   printf(“Please input your name:��);

这一段显示源码的错误提示是因为代码中使用了不可见的特殊字符,导致编译器无法识别。可以很容易发现源码中的printf(“Please input your name:”);的双引号使用的是中文模式输入,故将其改成printf("Please input your name:");

第二段:

hello.c:6:9: error: stray ‘\342’ in program
    6 |   scanf(���%s”,name);
      |         ^
hello.c:6:10: error: stray ‘\200’ in program
    6 |   scanf(���%s”,name);
      |          ^
hello.c:6:11: error: stray ‘\234’ in program
    6 |   scanf(��%s”,name);
      |           ^
hello.c:6:12: error: expected expression before ‘%’ token
    6 |   scanf(“%s”,name);
      |            ^
hello.c:6:14: error: stray ‘\342’ in program
    6 |   scanf(“%s���,name);
      |              ^
hello.c:6:15: error: stray ‘\200’ in program
    6 |   scanf(“%s���,name);
      |               ^
hello.c:6:16: error: stray ‘\235’ in program
    6 |   scanf(“%s��,name);
      |                ^

这一段显示源码的错误提示仍然是因为代码中使用了不可见的特殊字符,导致编译器无法识别。可以很容易发现源码中的scanf(“%s”,name);的双引号使用的是中文模式输入,故将其改成scanf("%s",name);

第三段:

hello.c:7:10: error: stray ‘\342’ in program
    7 |   printf(���Welcome %s!\n”,name);
      |          ^
hello.c:7:11: error: stray ‘\200’ in program
    7 |   printf(���Welcome %s!\n”,name);
      |           ^
hello.c:7:12: error: stray ‘\234’ in program
    7 |   printf(��Welcome %s!\n”,name);
      |            ^
hello.c:7:13: error: ‘Welcome’ undeclared (first use in this function)
    7 |   printf(“Welcome %s!\n”,name);
      |             ^~~~~~~
hello.c:7:22: error: ‘s’ undeclared (first use in this function)
    7 |   printf(“Welcome %s!\n”,name);
      |                      ^
hello.c:7:23: error: expected ‘)’ before ‘!’ token
    7 |   printf(“Welcome %s!\n”,name);
      |                       ^
      |                       )
hello.c:7:24: error: stray ‘\’ in program
    7 |   printf(“Welcome %s!\n”,name);
      |                        ^
hello.c:7:26: error: stray ‘\342’ in program
    7 |   printf(“Welcome %s!\n���,name);
      |                          ^
hello.c:7:27: error: stray ‘\200’ in program
    7 |   printf(“Welcome %s!\n���,name);
      |                           ^
hello.c:7:28: error: stray ‘\235’ in program
    7 |   printf(“Welcome %s!\n��,name);

这一段显示源码的错误提示仍然是因为代码中使用了不可见的特殊字符,导致编译器无法识别。可以很容易发现源码中的printf(“Welcome %s!\n”,name);的双引号使用的是中文模式输入,故将其改成printf("Welcome %s!\n",name);

此时改后的代码为:

此时进行编译报错如下:

提示错误是由于没有定义main()的类型,故将main函数前加上int,最终修改版代码如下:

再次进行编译结果显示通过如下:

      

输入./hello运行结果如下:

  

2.使用GDB 调试程序BUG(教材12.7节)

(1)使用文本编辑器输入以下代码greet.c。程序试图倒序输出main 函数中定义的字符串,但结果没有显示。

#include <stdio.h>
int display1(char *string);
int display2(char *string);
main()
{
    char string[] = “Welcome to Linux !”;
    display1(string);
    display2(string);
}

int display1(char *string)
{
    printf(“The original string is % s \n”, string);
}

int display2(char *string1)
{
    char *string2;
    int size, i;
    size = strlen(string1);
    string2 = (char *)malloc(size + 1);
    for (i = 0; i < size; i++)
    {
        string2[size - i] = string1[i];
    }
    string2[size + 1] =’’;
    printf(“The string afterward is % s\n”, string2);
}

(2)使用gcc –g 的选项编译这段代码,运行生成的可执行文件,观察运行结果。

(3)使用gdb 调试程序,通过设置断点、单步跟踪,一步步找出错误所在。(调试过程需截图)

(4)纠正错误,更改源程序并得到正确的结果。

解:

在终端输入vim greet.c,输入以上示例为:

输入gcc -o greet greet.c进行编译结果如下:

    

回到源码greet.c,我们根据报错信息分段分析。

第一段:

greet.c:4:1: warning: return type defaults to ‘int’ [-Wimplicit-int]

    4 | main()

      | ^~~~

这里错误提示为main()函数无类型,故在main()前加上int。

第二段:

greet.c: In function ‘main’:
greet.c:6:17: error: stray ‘\342’ in program
    6 | char string[] = ���Welcome to Linux!”;
      |                 ^
greet.c:6:18: error: stray ‘\200’ in program
    6 | char string[] = ���Welcome to Linux!”;
      |                  ^
greet.c:6:19: error: stray ‘\234’ in program
    6 | char string[] = ��Welcome to Linux!”;
      |                   ^
greet.c:6:20: error: ‘Welcome’ undeclared (first use in this function)
    6 | char string[] = “Welcome to Linux!”;
      |                    ^~~~~~~
greet.c:6:20: note: each undeclared identifier is reported only once for each function it appears in
greet.c:6:28: error: expected ‘,’ or ‘;’ before ‘to’
    6 | char string[] = “Welcome to Linux!”;
      |                            ^~
greet.c:6:37: error: stray ‘\342’ in program
    6 | char string[] = “Welcome to Linux!���;
      |                                     ^
greet.c:6:38: error: stray ‘\200’ in program
    6 | char string[] = “Welcome to Linux!���;
      |                                      ^
greet.c:6:39: error: stray ‘\235’ in program
    6 | char string[] = “Welcome to Linux!��;
      |   

这里错误提示为main()函数内的引号输入为中文模式下输入,需更改为英文状态。根据源码可以很容易发现其他的引号也均需要修改。

第三段:

greet.c: In function ‘display2’:
greet.c:20:8: warning: implicit declaration of function ‘strlen’ [-Wimplicit-function-declaration]
   20 | size = strlen(string1);
      |        ^~~~~~
greet.c:20:8: warning: incompatible implicit declaration of built-in function ‘strlen’
greet.c:2:1: note: include ‘<string.h>’ or provide a declaration of ‘strlen’
    1 | #include <stdio.h>
  +++ |+#include <string.h>
    2 | int display1(char *string);
greet.c:21:19: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]
   21 | string2 = (char *)malloc(size + 1);
      |                   ^~~~~~
greet.c:21:19: warning: incompatible implicit declaration of built-in function ‘malloc’
greet.c:2:1: note: include ‘<stdlib.h>’ or provide a declaration of ‘malloc’
    1 | #include <stdio.h>
  +++ |+#include <stdlib.h>
    2 | int display1(char *string);
greet.c:26:17: error: empty character constant
   26 | string2[size+1]='';

这个错误提示包含了三个问题:

  1. 隐式声明函数strlen/malloc的警告:可以通过在代码中添加#include <string.h>#include <stdlib.h>解决。
  2. 不兼容的隐式声明函数警告:这个问题是因为编译器默认隐式声明了strlen和malloc函数,但是实际上这些函数需要在头文件中声明。通过添加上述的头文件可以解决这个警告。
  3. 空字符常量错误:这个问题是因为在代码中有一个空的字符常量'',这是无效的。如果想要将一个字符数组的最后一个元素设为空字符,应该使用单引号括起来的空格字符,即' '。可以将代码中的空字符常量替换为' '来解决这个问题。

修改源码如下:

  

输入gcc -g test.c -o test进行编译结果如下:

输入./ greet

在23行(for循环处)设置断点:b 24;在29行(printf函数处)设置断点:b 29。此时输入info b查看断点设置情况。

    

输入r运行代码,也可输入n单步运行代码,继续单步运行代码数次,并使用命令查看,发现string2[size-1]的值正确。

继续程序的运行:c

在程序中,第24行代码为:string2[size-i] = string1[i];,这个语句是将字符串string1中的每个字符倒序复制到另一个字符串string2中。但是,在循环中,i的取值范围是从0到size-1,因此在第一次循环中,string2[size-i]实际上是string2[size-0],即string2的最后一个字符,而不是第一个字符。这会导致第一个字符无法被正确赋值。 为了解决这个问题,可以将循环的范围修改为从0到size。这样,在第一次循环中,string2[size-i]就会被正确地赋值为string1中的第一个字符,而不是最后一个字符。修改后的代码如下所示

重新进行编译,结果显示通过。

   


🌍4. 实验心得

  1. 编码注意事项: 在实验中,我学到了在编写代码时需要格外注意当前输入模式,避免在中文输入模式下输入英文符号。这是因为中文输入模式会导致符号被输入法转换,不直接对应ASCII码表中的字符。这种小细节的注意可以避免在后续编译和调试过程中因为字符转换引起的问题,确保代码的准确性和可靠性。

  2. 编译器选项的灵活运用: 通过使用gcc编译器,我掌握了如何通过命令行参数指定编译选项。具体而言,我了解到-Wall选项可开启所有警告信息,有助于发现潜在的错误和问题。同时,使用-g选项能够在编译时生成调试信息,提供更全面的调试支持。这种对编译选项的灵活运用不仅有助于提前发现潜在问题,也为后续的调试工作提供了更充分的信息支持。

  3. 高效调试技巧的应用: 通过实验,我学会了在Linux环境下使用GDB调试器进行代码调试的基本技巧。这包括使用break设置断点、run运行程序以及print打印变量值等命令。这些简洁而强大的调试命令使得在代码调试过程中能够更高效地定位和修复问题,提高了开发效率。通过掌握这些调试技巧,我能够更自信地处理代码中的错误和异常,确保程序的稳定性和可靠性。


📝总结

Linux操作系统的领域就像一片未被勘探的信息大海,引领你勇敢踏入开源系统的神秘领域。这是一场独特的学习冒险,从基本概念到系统架构,逐步揭示更深层次的操作系统原理、命令行工具和高级系统管理的奥秘。

渴望挑战Linux操作系统的学习路径和掌握系统管理技术?不妨点击下方链接,一同探讨更多Linux操作系统的奇迹吧。我们推出了引领趋势的💻 Linux专栏:《探秘Linux | 操作系统解密》,旨在深度探索Linux的实际应用和创新。🌐🔍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1349991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6之Promise的链式调用

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

微信商户号证书和密钥设置详细教程

1.先进入微信商户平台扫码登录微信商户号 微信商户平台 2.进入账户中心-API安全 3.申请API证书 3.1申请证书时按指引下载这个工具&#xff0c;这个工具里面包含你的证书信息 3.2 按指引安装该证书&#xff0c;安装完成以后证书会下载到你电脑的本地文件目录 4. 设置APIV2密…

建立网络矩阵:选择迅腾文化提供定制集成化服务、专业团队支持与拓展销售渠道

建立网络矩阵&#xff1a;选择迅腾文化提供定制集成化服务、专业团队支持与拓展销售渠道 在当今高度互联的数字时代&#xff0c;网络矩阵已成为企业常态化运营工具。网络矩阵不仅仅是一个单一的网站&#xff0c;而是由多个相互关联的数字资产组成的整体结构&#xff0c;包括官…

能答出这些问题,你就学会了模拟电路

自古以来&#xff0c;模拟电路和数字电路是电子工程师的学习重点&#xff0c;尤其是模拟电路&#xff0c;随着时代高速发展&#xff0c;越来越多高速高频设备使用模拟电路&#xff0c;在这种趋势下&#xff0c;很多电子人纷纷学习模电&#xff0c;但如何知道自己已经学成&#…

linux sh 脚本文件换行错误

windows 写好的脚本到服务运行不起来&#xff0c;显示换行问题 因为 windwos 的换行和 linux 的换行风格不同 解决办法&#xff1a;在使用的文本编辑器中&#xff0c;修改格式为 unix 格式 以 notepad 为例&#xff0c;在编辑 -> 文档格式转换中设置格式为 Unix

优优嗨聚集团:冬季旅游市场,寒风中的暖流“

随着季节的轮换&#xff0c;冬季的寒风已经开始轻轻掠过大地。对于很多人来说&#xff0c;这可能是一个蛰伏的季节&#xff0c;但对于旅游市场来说&#xff0c;冬季却是一个充满潜力和机遇的季节。今天&#xff0c;我们就来探讨一下冬季旅游市场的发展趋势&#xff0c;以及如何…

使用Gitea搭建自己的git远程仓库

Gitea 为什么需要自建仓库 原因只有一个&#xff1a;折腾。其实国内的码云加上github已经足够用了。 官方原话 Gitea 的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言&#xff0c;这使我们…

VUE——IDEA 启动前端工程VS文件启动前端工程

IDEA 启动前端 目录 前言一、打开控制台二、输入npm install三、依赖下载完之后&#xff0c;输入npm run dev&#xff0c;运行前端项目1、IDEA启动前端工程2、文件目录启动前端工程 四、点击http://localhost:8080后续敬请期待 前言 启动已有的vue前端项目 一、打开控制台 选…

Nacos、OpenFeign、Ribbon、loadbalancer组件工作的原理

Nacos、OpenFeign、Ribbon、loadbalancer组件工作的原理 Nacos是什么&#xff0c;官网中有这么一段话 这一段话说的直白点就是Nacos是一个注册中心和配置中心&#xff01; 在Nacos中有客户端和服务端的这个概念 服务端需要单独部署&#xff0c;用来保存服务实例数据的 客户端…

yolov5简单手势识别

实验目的 实验要求只需要识别五个简单的手势即可&#xff0c;分别对应的一下五个动作 动作对应标签名点赞goodOKok单手比心love数字 5five数字8eight 使用yolov5实现目标检测功能&#xff0c;有一下几个主要步骤 环境配置&#xff08;包括conda、labelimg、yolov5的下载&am…

【解决|三方工具】导入 XChart 后提示丢失关于 TMPPro 工具引用

开发平台&#xff1a;Unity 2021 版本 插件版本&#xff1a;XChart 3.0&#xff1a;官方文档 - https://github.com/XCharts-Team/XCharts   问题描述 导入 XChart 插件至 Unity 中出现 目录&#xff1a;Component、Theme 等提示丢失 TMPPro&#xff08;TextMeshPro 工具&…

iOS实时查看App运行日志

目录 一、设备连接 二、使用克魔助手查看日志 三、过滤我们自己App的日志 &#x1f4dd; 摘要&#xff1a; 本文介绍了如何在iOS iPhone设备上实时查看输出在console控制台的日志。通过克魔助手工具&#xff0c;我们可以连接手机并方便地筛选我们自己App的日志。 &#x1f4…

Java报表是什么?盘点2024最实用的四款Java报表!

Java报表工具在Java环境下发挥着重要的作用&#xff0c;它们通过提供可视化操作界面&#xff0c;支持通用jdbc数据库&#xff0c;并可以输出多种格式报表&#xff0c;帮助用户更好地处理和分析数据。这些工具应用广泛&#xff0c;例如在数据展示、数据统计和分析、数据监控以及…

项目经验简单总结

引擎 unity 2020 语言 C# lua python(用于工具链) java (用于SDK对接) js&#xff08;PC WEB SDK对接&#xff09; 编辑器 VS VSCODE IDEA eclipse 项目开发模块规划分 主项目工程&#xff0c;UI资源项目工程&#xff0c;模型场景资源项目工程 主项目工程&#xff1a;所有的…

GC6236,GC6208,GC6209镜头驱动芯片选型,多应用于摄像机镜头,家庭监控云台驱动等产品中

国产芯片GC6236&#xff0c;GC6208&#xff0c;GC6209 为5V摄像机镜头驱动芯片&#xff0c;电压范围在3~5.5(V)&#xff0c;最大持续电流可达0.8(A)最高工作温度在-40~100之间。其特点都具有5V多通道&#xff0c;低噪步进电机驱动和霍尔自动光圈驱动等。可应用在摄像机镜头,家庭…

深度学习|3.6 激活函数 3.7 为什么需要非线性激活函数

激活函数 主要有sigmoid函数、tanh函数、relu函数和leaky relu函数 tanh函数相比sigmoid函数是具有优势的&#xff0c;因为tanh函数使得输出值的平均值为0&#xff0c;而sigmoid函数使得输出值的平均值为1/2&#xff0c;对下一层来说tanh输出的0更好进行处理。 激活函数tanh…

【数据结构和算法】 相等行列对

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 三层循环 2.2 哈希 二层循环 三、代码 3.1 三层循环 3.2 哈希 二层循环 四、复杂度分析 4.1 …

Eureka注册及使用

一、Eureka的作用 Eureka是一个服务注册与发现的工具&#xff0c;主要用于微服务架构中的服务发现和负载均衡。其主要作用包括&#xff1a; 服务提供者将自己注册到Eureka Server上&#xff0c;包括服务的地址和端口等信息。服务消费者从Eureka Server上获取服务提供者的地址…

C++入门【17-C++ 字符串】

C 字符串 C 提供了以下两种类型的字符串表示形式&#xff1a; C 风格字符串C 引入的 string 类类型 C 风格字符串 C 风格的字符串起源于 C 语言&#xff0c;并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此&#xff0c;一个以 null 结尾…

2023年度十大科技名词发布:大语言模型、脑机接口在列

源自&#xff1a;IT之家 “人工智能技术与咨询” 发布 IT之家 12 月 26 日消息&#xff0c;据光明日报&#xff0c;全国科学技术名词审定委员会事务中心联合国家语言资源监测与研究平面媒体中心、蜜度微热点研究院、万方数据、百度百科、百度指数、《中国科技术语》杂志社等…