Linux系统编程 系统编程概念

news/2023/11/30 10:11:33

1.系统调用

系统调用(system call)其实是 Linux 内核提供给应用层的应用编程接口(API),是 Linux 应用层进入内核的入口。不止 Linux 系统,所有的操作系统都会向应用层提供系统调用,应用程序通过系统调用来使用操作系统提供的各种服务。

通过系统调用,Linux 应用程序可以请求内核以自己的名义执行某些事情,譬如打开磁盘中的文件、读写文件、关闭文件以及控制其它硬件外设。

通过系统调用 API,应用层可以实现与内核的交互,其关系可通过下图简单描述:

内核、系统调用与应用程序

在这里插入图片描述

内核提供了一系列的服务、资源、支持一系列功能,应用程序通过调用系统调用 API 函数来使用内核提供的服务、资源以及各种各样的功能,如果大家接触过其它操作系统编程,想必对此并不陌生,譬如 Windows 应用编程,操作系统内核一般都会向应用程序提供应用编程接口 API,否则我们将我无法使用操作系统。

Linux 系统编程则指的是基于 Linux 操作系统的应用编程,在应用程序中通过调用系统调用 API 完成应用程序的功能和逻辑,应用程序运行于操作系统之上。

通常在操作系统下有两种不同的状态:内核态用户态,应用程序运行在用户态、而内核则运行在内核态。

2.库函数

前面介绍了系统调用,系统调用是内核直接向应用层提供的应用编程接口,譬如 open、write、 read、close 等。编写应用程序除了使用系统调用之外,我们还可以使用库函数。

库函数也就是 C 语言库函数,C 语言库是应用层使用的一套函数库,在 Linux 下,通常以动态(.so) 库文件的形式提供,存放在根文件系统/lib 目录下,C 语言库函数构建于系统调用之上,也就是说库函数其实是由系统调用封装而来的,当然也不能完全这么说,原因在于有些库函数并不调用任何系统调用,譬如一些字符串处理函数 strlen()、strcat()、memcpy()、memset()、strchr()等等;而有些库函数则会使用系统调用来帮它完成实际的操作,譬如库函数 fopen() 内部调用了系统调用 open() 来帮它打开文件、库函数 fread() 就利用了系统调用 read() 来完成读文件操作、fwrite() 就利用了系统调用 write() 来完成写文件操作。

Linux 系统内核提供了一系列的系统调用供应用层使用,我们直接使用系统调用就可以了呀,那为何还要设计出库函数呢?事实上,有些系统调用使用起来并不是很方便,于是就出现了 C 语言库,这些 C 语言 库函数的设计是为了提供比底层系统调用更为方便、更为好用、且更具有可移植性的调用接口。

库函数和系统调用的区别

  • 库函数是属于应用层,而系统调用是内核提供给应用层的编程接口,属于系统内核的一部分;
  • 库函数运行在用户空间,调用系统调用会由用户空间(用户态)陷入到内核空间(内核态);
  • 库函数通常是有缓存的,而系统调用是无缓存的,所以在性能、效率上,库函数通常要优于系统调用;
  • 可移植性:库函数相比于系统调用具有更好的可移植性,通常对于不同的操作系统,其内核向应用层提供的系统调用往往都是不同,譬如系统调用的定义、功能、参数列表、返回值等往往都是不一 样的;而对于 C 语言库函数来说,由于很多操作系统都实现了 C 语言库,C 语言库在不同的操作系统之间其接口定义几乎是一样的,所以库函数在不同操作系统之间相比于系统调用具有更好的可移植性。

从实现者的角度来看,系统调用与库函数之间有根本的区别,但从用户使用角度来看,其区别并不重要,它们都是 C 语言函数。在实际应用编程中,库函数和系统调用都会使用到,所以对于我们来说,直接把它们当做是 C 函数即可,知道你自己调用的函数是系统调用还是库函数即可,不用太过于区分它们之间的差别。

标准C语言函数库

在 Linux 系统下 , 使用的 C 语言库为 GNU C 语言函数库(也叫作 glibc, 其网 址为 http://www.gnu.org/software/libc/),作为 Linux 下的标准 C 语言函数库。

3.main函数

对学习过 C 语言编程的读者来说,main 函数想必大家再熟悉不过了,很多编程开发都是以 main 函数作为程序的入口函数,同样在 Linux 应用程序中,main 函数也是作为应用程序的入口函数存在,main 函数的形参一般会有两种写法,如果执行应用程序无需传参,则可以写成如下形式:

//无传参
int main(void) {}

如果在执行应用程序的时候需要向应用程序传递参数,则写法如下:

//传参
int main(int argc, char **argv) {/* 代码 */
}

argc 形参表示传入参数的个数,包括应用程序自身路径和程序名,譬如运行当前目录下的 hello 可执行文件,并且传入参数,如下所示:

./hello 112233

那么此时参数个数为 2,并且这些参数都是作为字符串的形式传递给 main 函数:

  • argv[0]等于"./hello"
  • argv[1]等于"112233"

些参数都是作为字符串的形式传递给 main 函数:

  • argv[0]等于"./hello"
  • argv[1]等于"112233"

有传参时 main 函数的写法并不只有这一种,只是这种写法最常用

4.环境搭建

Centos

在CentOS系统上搭建C/C++语言环境可以按照以下步骤进行:

  1. 安装GCC编译器:
    在终端中输入以下命令来安装GCC编译器:

    sudo yum install gcc
    
  2. 安装C++编译器和标准库:
    在终端中输入以下命令来安装C++编译器和标准库:

    sudo yum install gcc-c++
    
  3. 验证安装:
    输入以下命令来验证GCC和C++编译器的安装是否成功:

    gcc --version
    g++ --version
    

    如果显示了相应的版本信息,则表示安装成功。

  4. 安装make工具:
    在终端中输入以下命令来安装make工具:

    sudo yum install make
    
  5. 验证make工具的安装:
    输入以下命令来验证make工具的安装是否成功:

    make --version
    

    如果显示了版本信息,则表示安装成功。

通过以上步骤,你就成功在CentOS系统上搭建了C/C++语言环境。现在你可以编写和编译C/C++程序了。

Ubuntu

在Ubuntu系统上搭建C/C++语言环境可以按照以下步骤进行:

  1. 安装GCC编译器:
    在终端中输入以下命令来安装GCC编译器:

    sudo apt update
    sudo apt install build-essential
    
  2. 安装C++编译器和标准库:
    在终端中输入以下命令来安装C++编译器和标准库:

    sudo apt install g++
    
  3. 验证安装:
    输入以下命令来验证GCC和C++编译器的安装是否成功:

    gcc --version
    g++ --version
    

    如果显示了相应的版本信息,则表示安装成功。

  4. 安装make工具:
    在终端中输入以下命令来安装make工具:

    sudo apt install make
    
  5. 验证make工具的安装:
    输入以下命令来验证make工具的安装是否成功:

    make --version
    

    如果显示了版本信息,则表示安装成功。

通过以上步骤,你就成功在Ubuntu系统上搭建了C/C++语言环境。现在你可以编写和编译C/C++程序了。


https://www.xjx100.cn/news/3091946.html

相关文章

对比学习15篇顶会论文及代码合集,2023最新

对比学习(contrastive learning)是现在无监督学习中一种常用的学习机制,它可以在没有标签的数据上进行学习,避免依赖大量标签数据,从而帮助我们更好地理解和利用数据集中的信息,提高模型的性能和表现。 作…

从小米14安装不上应用说起【适配64位】

一、原因 某天早上,同事突然对我说我换了小米14pro手机但是安装不了公司的打卡软件,怎么办呀。一时间,我也不知道原因,看到给我发的安装不上的截图陷入了沉思。随即打开在git仓库里找到这个项目,到本地编译打开&#…

3PC(三阶段提交)

三阶段提交 3PC(Three-Phase Commit)是一种分布式系统中用于实现事务一致性的协议,它是在2PC(Two-Phase Commit)的基础上发展而来,旨在解决2PC的一些缺点。与2PC的两个阶段(准备和提交&#xf…

【Spring篇】Bean实例化的四种方式及应用案例

目录 Bean的实例化 通过构造方法实例化Bean; 通过简单工厂模式创建对象; 使用案例 通过使用工厂方法模式 使用案例 通过FactoryBean接口实例化 使用案例 Bean的实例化 Bean的实例化有四种方式,这里的实例化Bean和之前学的注入是两回事…

C++中的内存管理

✨前言✨ 📘 博客主页:to Keep博客主页 🙆欢迎关注,👍点赞,📝留言评论 ⏳首发时间:2023年11月21日 📨 博主码云地址:博主码云地址 📕参考书籍&…

为什么云游戏被认为是行业的未来趋势?

5G 时代的到来,游戏行业也正在经历着一场革命性的变革。云游戏,这个看似神秘的新兴领域,正在逐渐成为行业的未来趋势。 一、云游戏的优势 摆脱硬件束缚 在传统游戏中,玩家需要购买昂贵的游戏主机或电脑,才能享受高质…

如何优雅的删除HashMap元素

文章目录 1.数据准备2.删除方式2.1.使用增强 for 循环删除2.2.使用 forEach 循环删除2.3.使用 Iterator 迭代器删除2.4 使用 removeIf 删除&#xff08;推荐使用&#xff09;2.5.使用 Stream 删除&#xff08;推荐使用&#xff09; 1.数据准备 public Map<String, String&g…

面向对象程序设计1-类的定义和使用

第1关&#xff1a;数字时钟走字 任务描述 本关任务&#xff1a;本题中已给出一个时钟类的定义&#xff0c;请模拟数字时钟走字过程。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.类和对象。 编程要求 根据提示&#xff0c;在右侧编辑器补充代码&…