Linux系统编程 系统编程概念

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

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

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

相关文章

为什么Transformer模型中使用Layer Normalization(Layer Norm)而不是Batch Normalization(BN)

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

GCC 学习

GCC Resource Center for GCC Internalshttps://www.cse.iitb.ac.in/grc/这是个不错资料网站,有兴趣的可以了解下

本地搭建Stackedit Markdown编辑器结合内网穿透实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器,在GitHub上拥有20.7k Star!,它支持将Markdown笔记保…

AR远程辅助技术应用到气象部门有何好处?

随着科技的不断发展,人类对于自然环境的理解和掌控能力也在不断提升。其中,AR(增强现实)技术的应用,为气象监控带来了革命性的变化。AR气象远程监控,就是将AR技术与气象监控相结合,通过虚拟与现实的融合,实…

Hive安装配置 - 本地模式

文章目录 一、Hive运行模式二、安装配置本地模式Hive(一)安装配置MySQL1、删除系统自带的MariaDB2、上传MySQL组件到虚拟机3、在主节点上安装MySQL组件4、在主节点上配置MySQL(1)查看MySQL服务状态(2)查看M…

蓝桥杯每日一题2023.11.18

题目描述 蓝桥杯大赛历届真题 - C 语言 B 组 - 蓝桥云课 (lanqiao.cn) 题目分析 本题使用搜索,将每一个格子进行初始赋值方便确定是否为相邻的数,将空出的两个格子首先当作已经填好数值为100,此时从第一个格子右边的格子开始搜索&#xff…

实在智能出席山东省数据科学大会,构建产学研教数智创新生态

11月18日至19日,由山东大学、山东省科学技术协会、山东省大数据局主办的首届“山东省数据科学大会暨泰山科技论坛”在山东大学(中心校区)隆重召开,以“数聚慧能 科创未来”为主题,来自全国各地的高校、科研机构、企事业…

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

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

每日一练:X加上100为完全平方数,再加上168任然为完全平方数

题目 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 实现方式1 解题思路 设整数为x,根据题意建立方程:   (1) x 100 是一个完全平方数,即存在整数a满…

JavaWeb开发——文件上传

1 简介 文件上传:将本地图片、视频、音频等文件上传到服务器,供其他用户浏览或下载的过程 文件上传涉及到两部分:前端程序 服务端程序 前端程序 【三要素】:① 需要定义一个form 表单,且表单里需定义一个类型为“ …

使用centos搭建内网的yum源

1.安装httpd服务 2.启动服务,设置开机自启 #启动服务 systemctl start httpd # 设置开机自动启动 systemctl enable httpd systemctl status httpd3.新建一个目录,将rpm文件放到该目录下 4.将/etc/httpd/conf/httpd.conf文件中的DocumentRoot "…

Qt专栏3—Qt项目创建Hello World

setp1 打开软件 双击Qt Creator 11.0.3 (Community),打进入软件界面 step2 创建项目 点击创建项目 step3 选择模板 选着Application(Qt)->Qt Widgets Application setp4 设置项目 名称中填入项目号名,创建路径中填入项目保存位…

每日一题(LeetCode)----链表--两两交换链表中的节点

每日一题(LeetCode)----链表–两两交换链表中的节点 1.题目([24. 两两交换链表中的节点](https://leetcode.cn/problems/spiral-matrix/)) 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内…

第四代可燃气体监测仪:可燃气体监测仪效果有哪些?

在城市之中一旦发生燃气事故,往往会为社会公共安全和公众利益带来极大的危害,扰乱社会运行的稳定秩序,威胁着城市生命线的运行。因此对于城市燃气事故的预防和应对工作,必须得到充分的重视和关注。城市燃气事故的预防工作&#xf…

机器学习---初识贝叶斯分类器

1. 引入问题 有两个可选的假设:病人有癌症、病人无癌症,可用数据来自化验结果:正和负- 有先验知识:在所有人口中,患病率是0.008,对确实有病的患者的化验准确率为98%,对确实无 病的患者的化验…

redis--高可用之持久化

redis高可用相关知识 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了保证提供正常服务( 如主…

【MySQL】一些内置函数(时间函数、字符串函数、数学函数等,学会了有妙用)

内置函数 前言正式开始时间函数显示当前日期、时间、日期时间的日期计算相差多少天示例创建一张表,记录生日 留言表 字符串函数charsetconcatinstr(string, substring)ucase和lcaseleft(string, length)length求字符串长度replace(str, search_str, replace_str)tri…

Python实现视频字幕时间轴格式转换

自己喜欢收藏电影,有时网上能找到的中文字幕文件都不满足自己电影版本。在自己下载的压制版电影中已内封非中文srt字幕时,可以选择自己将srt的时间轴转为ass并替换ass中的时间轴。自己在频繁 复制粘贴改格式的时候想起可以用Python代码完成转换这一操作&…

Windows配置全局代理

一. Windows下为PowerShell/CMD/Git设置代理 —————————————————————————————————————————————————————— 二. [WinError 10061] 由于目标计算机积极拒绝,无法连接。 keyerror:192。 HTTP Error 403: Forbidd…