Linux系统编程 系统编程概念

news2024/11/16 19:28:28

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 函数的写法并不只有这一种,只是这种写法最常用

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++程序了。

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

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

相关文章

(论文阅读51-57)图像描述3 53

51.文献阅读笔记(KNN) 简介 题目 Exploring Nearest Neighbor Approaches for Image Captioning 作者 Jacob Devlin, Saurabh Gupta, Ross Girshick, Margaret Mitchell, C. Lawrence Zitnick, arXiv:1505.04467 原文链接 http://arxiv.org/pdf/1…

PHP中isset() empty() is_null()的区别

在PHP中,isset()、empty()和is_null()是用于检查变量状态的三个不同的函数。它们分别用于检查变量是否已设置、是否为空以及是否为null。在本文中,我们将详细解释这三个函数的用法、区别和适当的使用场景。 isset(): isset()函数用于检查一个变量是否已…

SystemV

一、共享内存 1、直接原理 进程间通信的本质是:先让不同的进程,看到同一份资源!! 我们要把这句话奉若圭臬一般 到了共享内存了支持双向通信能读也能写,但是一般都是一个读一个写 要想通信先看到同一个份资源&#xff0…

Spring-IOC-FactoryBean机制(难点且重点)

1、第一个案例 1.1、Book.java package com.atguigu.ioc; import lombok.Data; Data public class Book {private String bid;private String bname; }1.2、Book2.java package com.atguigu.ioc; import lombok.Data; Data public class Book2 extends Book {private String co…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大难点分析

数字化时代银行网点厅堂营销存在以下5大难点: 1、识别难。识别有效的客户比较难,传统的厅堂识别主要依据客户的衣着气质等主管感受,判断客户是否为潜在中高端客户,提供相关服务。大堂经理主管识别与智能化系统识别相结合&#xf…

新安装win11,搜索框无法输入的问题

正确的做法是如下: 1首先进入win11系统,在搜索框中输入“ 控制面板 ”将其打开2在控制面板中找到“时间和语言“ 标题 再选择“ 语言和区域”, 标题 在显示的语言上面,点击省略号,进入语言选项 标题 在键盘处,删除不需要的输入法…

speech studio-神经网络定制自己的声音

Speech Studio - 神经网络定制声音 - 概述 (microsoft.com)

Zero-Shot Restoration of Back-lit Images Using Deep InternalLearning

ABSTRACT 如何恢复背光图像仍然是一项具有挑战性的任务。该领域最先进的方法基于监督学习,因此通常仅限于特定的训练数据。在本文中,我们提出了一种用于背光图像恢复的“零样本”方案,该方案利用深度学习的力量,但不依赖于任何先…

从大模型到内容生成,初窥门径的AI新次元

视频云AI进化新纪元。 最近Gartner发布2024年十大战略技术趋势,AI显然成为其背后共同的主题。全民化的生成式人工智能、AI增强开发、智能应用......我们正在进入一个AI新纪元。 从ChatGPT的横空出世,到开发者大会的惊艳亮相,OpenAI以一己之力…

JVM--Java虚拟机

0. java代码的执行过程 了解Java虚拟机(JVM)首先需要了解一下一段Java代码的具体执行过程。 Java代码的具体执行过程如下: 执行 javac 命令编译源代码为字节码执行 java 命令,二进制字节码通过解释器翻译为机器码 创建 JVM&…

《QT从基础到进阶·三十五》QT插件实现侧边工具栏tabBar

tabBar是用QT插件实现的一个dll,对于插件的使用可以参考文章: 《QT从基础到进阶三十三》QT插件开发QtPlugin 源码放在文章末尾 该功能类似侧边工具栏,可以在该标签栏上添加自己开发的界面,实现代码如下: 1、所有功能…

【大数据分布并行处理】实验测试(一)

文章目录 测试任务1测试任务2测试任务3 测试任务1 使用HDFS相关命令完成下列四个操作(20分) 操作1:在HDFS根目录创建以自己名字命名的目录,并查看是否创建成功(5分)。 提示:截图包括&#xff…

目标检测 详解SSD原理,数据处理与复现

原理详解 前言 今天我们要读的这篇VGGNet(《Very Deep Convolutional Networks For Large-Scale Image Recognition》),就是在AlexNet基础上对深度对网络性能的影响做了进一步的探索。它是ImageNet 2014年亚军,相比于AlexNet&am…

智能车入门补充篇——电感值处理、转向控制与巡线

冒泡法 冒泡法是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡排序的时间复杂度为O(n^…

电脑上可以写便签的软件哪些界面比较可爱且好用?

电脑上可以安装使用的便签类软件比较多,在选择使用电脑便签软件时,很多人对便签的外观界面还是比较在意的,一个好看的便签界面在一方面可以引起大家的注意,另一方面可以增加电脑桌面背景和便签类软件的协调性。 电脑便签软件通常…

Web测试中文件上传测试

总体情况 1、功能实现: (1)文件类型正确、大小合适 (2)文件类型正确,大小不合适 (3)文件类型错误,大小合适 (4)文件类型和大小都合适&#x…

引迈-JNPF低代码项目技术栈介绍

从 2014 开始研发低代码前端渲染,到 2018 年开始研发后端低代码数据模型,发布了JNPF开发平台。 谨以此文针对 JNPF-JAVA-Cloud微服务 进行相关技术栈展示: 1. 项目前后端分离 前端采用Vue.js,这是一种流行的前端JavaScript框架&a…

风丘远程试验管理平台TFM 支持“一键式“数据管理和监控

随着信息技术的高速发展,企业对远程试验实时监控与数据管理的需求日益增强。而利用远程试验信息协同技术,可突破部门与地域的限制,并把试验现场的车辆状态信息、试验数据和分析结果实时传输给数据分析部门和设计部门等,从而缩短时…

SQL的连接join

一、连接说明 union、intersect等集合运算,它的特征是以 “行” 为单位进行操作,通俗点说,就是进行这些集合运算,会导致记录行数的增减,使用union会增加记录行数,使用 intersect 或 expect 会减少行记录&a…

印刷企业数字工厂管理系统建设方案

随着科技的飞速发展,传统印刷企业正面临着前所未有的挑战。产能短缺、质量控制不足、成本控制不力以及服务质量不高等问题成为了制约企业发展的瓶颈。为了解决这些问题,印刷企业需要积极拥抱数字化转型,构建数字工厂管理系统。 一、印刷企业数…