快乐江湖
专注人工智能领域和优质计算机学习笔记创作
展开
-
【README】Linux系统编程必读:本专栏内容提要以及系统调用接口总结
文章目录发刊词第一部分:博客内容核心点睛(1)基础篇1:Linux系统编程1:Linux中使用率最高的一些命令发刊词Linux系统编程的重要性不言而喻,服务器几乎无一例外用的都是Linux。但是我们日常生活中的编程很多都是在Windows中运行,不同于Java(Java本身就拥有Java虚拟机的支持所以它能跨平台),对于C/C++这种编译型语言,有时候在Windows下可以运行成功但是放在Linux却会错的离谱。所以这就需要系统的学习Linux下系统的编程。本专栏也是本人的Linux系统编程学习心得,原创 2021-05-04 16:15:57 · 2394 阅读 · 6 评论 -
Linux系统编程1:基础篇之Linux中使用率最高的一些命令
文章目录一:Linux基本指令(1)pwd系统:Centos 8.0一:Linux基本指令(1)pwd一句话:显示用户当前所在目录补充:Linux——一切皆文件,与Windows操作系统不同,Windows系统下的文件目录 是以“\”分割的,而Liunx则以 “/” 分割。而网页url也是以 "/"进行分割的,这是因为网页的服务器端使用的操作系统是“Linux”,那么反应在前端也正是这样子的。...原创 2021-01-20 22:29:18 · 1443 阅读 · 3 评论 -
Linux系统编程2:基础篇之详解Linux中的权限问题
文章目录权限(1)超级用户和普通用户(2)Linux权限管理A:文件访问者的分类B:文件类型和访问权限A:文件类型B:基本权限C:权限的表示方法D:权限的设置E:粘滞位补:权限(1)超级用户和普通用户超级用户:想干什么就干什么普通用户:权限受到部分限制普通用户切换到超级用户切换到其他用户(2)Linux权限管理A:文件访问者的分类Linux把文件的访问者分为如下三类u(user):文件或文件目录的所有者g(group):文件和文件目录的所有者所在组的用户o(other):其原创 2021-04-26 09:56:45 · 656 阅读 · 0 评论 -
Linux系统编程3:基础篇之详解Linux软件包管理器yum
文章目录(1)什么是软件包A:软件包B:注意事项C:yum基本使用(2)安装rzsz(1)什么是软件包A:软件包区别Windows,在Linux下安装软件,第一种方法是下载程序源代码,然后进行编译,就得到了程序;第二种方法是rpm包安装。但是这两种方法都不推荐使用我们推荐使用yum(Yellow dog updater,Modified)安装。 为了解决这样的麻烦,一些人将软件提前编译好并做成软件包(类似于Windows上的安装程序.exe)放置于服务器上,通过包管理器(yum正是一种包管理器)获原创 2021-04-26 10:18:16 · 533 阅读 · 0 评论 -
Linux系统编程4:入门篇之最强编辑器vim的使用攻略
文章目录(1)创建文件(2)三种基本模式(3)vim命令模式指令集A:复制与粘贴B:删除C:光标移动和定位D:撤销(4)vim末行模式命令集A:查找B:设置行号C:跨文件操作(5)补充(6)vim配置(7)最后前言之前编写C语言程序,经常会使用到VS,VS是属于IDE的代表,也就是集成开发环境,它将上述很多功能集成于一体,让开发者只去关心代码的编写操作,而无需过多顾及其他方面,让使用者感到很方便。正如为什么不常用Python去实现数据结构呢,因为Python封装的太厉害了,不便于我们更深层次的去掌握这原创 2021-04-26 10:21:12 · 660 阅读 · 1 评论 -
Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 && gcc/g++使用详解
文章目录(1)gcc/g++完成编译的过程A:预处理B:编译C:汇编D:链接(2)gcc/g++选项(3)重要概念:函数库A:gcc/g++在哪实现了函数B:静态库与动态库(1)gcc/g++完成编译的过程A:预处理预处理主要包括宏定义,文件包含,条件编译,去注释输入gcc -E hello.c -o hello.i,其中选项E作用是让gcc在预处理后停止编译B:编译此阶段,gcc检查代码的规范性,是否具有语法错误输入gcc -S hello.i -o hello.s,即可将预处理里原创 2021-04-26 11:32:35 · 697 阅读 · 0 评论 -
Linux系统编程6:入门篇之如何拿下gdb调试器?来和我一起调试一个程序
文章目录(1)debug与release(2)调试一个程序(3)总结-gdb选项(1)debug与release程序的发布方式有debug和release两种模式,release没有调试信息,不能进行调试,体积较小,debug携带调试信息,可以进行调试,但是文件较大Linux中,使用gcc/g++编译的程序,默认使用的是release模式,所以就不能直接使用gdb进行调试。如果想要调试,必须在进行gcc/g++编译时,携带-g选项如下,同一个文件分别使用debug(带-d的)和release,其中原创 2021-04-26 11:58:24 · 422 阅读 · 0 评论 -
Linux系统编程7:入门篇之Linux项目自动化构建工具-Make/Makefile的超强使用指南
文章目录(1)前言(2)依赖关系和依赖方法(3)单文件Makefile(4)多文件Makefile(5)总结(1)前言对于一个大型项目,可能会涉及到很多文件,例如头文件,源文件等等。在VS中,我们只需在其设定的目录下,新建对应文件然后进行编写即可,然后按下运行键,只要你的代码没有问题,那么就可以运行出结果。这一切一切的感觉看起来很轻松,但是实则不然,例如首先编译哪个文件,如何链接?这些都是需要考虑的,但是VS作为一个集成开发环境,自然而然帮你做好了这一切,但是在Linux中,这些都是需要自己做的。而正因原创 2021-04-26 12:01:30 · 544 阅读 · 0 评论 -
Linux系统编程1-7总结项目:进度条的实现
文章目录原创 2021-01-24 16:31:59 · 469 阅读 · 3 评论 -
Linux系统编程8:入门篇之简单明了说明如何在Linux中Git提交代码
如何在Linux上使用GitHub托管代码按照正常步骤,在GitHub上创建一个代码仓库,复制https使用git clone,在本地创建相应的一个仓库需要的代码,拷贝到这个仓库里三板斧之第一板斧–git add。输入git add [文件名]三板斧之第二板斧-git commit。输入git commit三板斧之第三板斧-git push。输入git push,然后输入用户名和密码即可...原创 2021-04-26 12:06:55 · 301 阅读 · 0 评论 -
Linux系统编程9:进程入门之操作系统为什么这么重要以及它是如何实现管理的
文章目录(1)操作系统是什么(2)操作系统是如何管理的(3)系统调用和库函数(4)为什么需要操作系统(1)操作系统是什么百度百科上关于操作系统的定义是这样的:操作系统(operation system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互的操作界面。简单点来说,操作系统就是一款软件,它的作用就是管理电脑,管好电脑硬件以及软件。(2)操原创 2021-04-27 08:37:05 · 526 阅读 · 0 评论 -
Linux系统编程10:进程入门之系统编程中最重要的概念之进程&&进程的相关操作&&使用fork创建进程
文章目录(1)进程的概念(2)如何管理进程A:描述B:PCBC:task_struct(3)进程相关操作A:查看进程B:进程与父进程(4)创建进程-forkA:fork的作用:演示B:fork相关问题为了方便,引入需要用到一些命令(这些命令后续会说)首先编写一个C语言文件,其作用是每隔一秒在屏幕上输出Hello#include <stdio.h>#include <unistd.h>int main(){ while(1) { printf("Hello\n")原创 2021-04-27 08:40:22 · 646 阅读 · 0 评论 -
Linux系统编程11:进程入门之详细阐述进程的一些状态&&区分僵尸状态和孤儿状态&&动图演示
文章目录(1)几个重要的状态A:R(running)-运行状态B:S(sleeping)-睡眠状态C:D(Disk sleep)-磁盘休眠状态D:T(stopped)-停止(2)进程状态路线图(3)特殊的进程状态-僵尸进程A:僵尸进程是什么B:一个例子C:为什么要有僵尸进程(4)特殊的进程状态-孤儿进程进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换Linux源代码中定义进程状态如下/** The task state array is a strange "bitmap原创 2021-04-27 08:42:47 · 621 阅读 · 0 评论 -
Linux系统编程12:进程入门之进程的优先级及PR和NI&&如何修改进程优先级
文章目录(1)什么是进程的优先级(2)进程优先级如何表示(3)PRI和NIA:什么是PRI和NIB:如何修改进程优先级(4)其他概念(1)什么是进程的优先级这里首先要区分优先级和权限的关系:以食堂举例,你能去学生食堂而不能去职工食堂,这是因为你没有权限,你可以去食堂,但是你却排不上队,这是因为你的优先级不够(你跑的够不够快,排的是不是在前面)换到进程中,当进程太多时,进程就需要被合理的管理,总不能谁都抢着去占用CPU,所以CPU分配资源的先后顺序就是进程的优先级在计算机中肯定是进程数大于CPU的数量原创 2021-04-27 08:44:32 · 1060 阅读 · 0 评论 -
Linux系统编程13:进程入门之Linux中的环境变量的概念及其相关命令(export;env等)&&main函数的参数
文章目录(1)为什么你的程序不能直接执行?(2)环境变量(3)查看/设置环境变量(4)和环境变量相关的命令总结(5)通过代码获取环境变量A:main函数的前两个参数B:main函数的第三个参数(6)环境变量的全局属性(1)为什么你的程序不能直接执行?我们知道在Linux编写C/C程序,编译完成之后,如果需要运行这个程序,需要加上./,表示当前路径下。在Linux下,一切皆文件,因此像我们熟知的ls,mkdir这些命令都存在与/usr/bin目录下但是问题就在于这:为什么都是程序,都是命令,像ls原创 2021-04-27 08:48:41 · 455 阅读 · 0 评论 -
Linux系统编程14:进程入门之Linux进程中非常重要的概念之进程地址空间-原来我们看到的地址全部是虚拟的
文章目录一:操作系统(1)操作系统是什么(2)操作系统是如何管理的(3)系统调用和库函数(4)为什么需要操作系统二:Linux进程(1)进程的概念(2)如何管理进程A:描述B:PCBC:task_struct(3)进程相关操作A:查看进程B:进程与父进程(4)创建进程-forkA:fork的作用:演示B:fork相关问题三:进程状态(1)几个重要的状态A:R(running)-运行状态B:S(sleeping)-睡眠状态C:D(Disk sleep)-磁盘休眠状态D:T(stopped)-停止(2)进程状态原创 2021-03-02 14:42:10 · 785 阅读 · 5 评论 -
Linux系统编程15:进程控制之如何创建进程和写时拷贝技术
文章目录(1)fork函数回顾(2)写时拷贝(1)fork函数回顾在下面这篇文章我们演示了fork函数以及相关细节点击跳转还是借助上文中的程序和效果图片#include <stdio.h>#include <unistd.h>int main(){ printf("执行到fork函数之前其进程为:%d,其父进程为:%d\n",getpid(),getppid()); sleep(1); fork(); sleep(1); prinf("这个进程原创 2021-04-27 08:52:06 · 439 阅读 · 0 评论 -
Linux系统编程16:进程控制之进程终止以及终止进程的三种情况
文章目录(1)进程终止时的三种情况(2)退出进程的方法A:正常退出-exit和return的区别B:异常退出C:_exit()函数(3)实践(1)进程终止时的三种情况一个进程结束了,无外乎是以下三种情况中的一种代码跑完,结果正确代码跑完,结果不正确代码没有跑完,进程被强制中断那么一个进程结束时,操作系统是如何判断这个进程是正常结束还是非正常结束的呢?其实是通过进程的退出码,这一点可以联想到为什么C/C++中main函数最后写的是return 0?因为0代表进程正常退出,非0代表进程异常退出,原创 2021-04-27 08:54:11 · 1164 阅读 · 0 评论 -
Linux系统编程17:进程控制之进程等待&&为什么进程需要被等待&wait方法和waitpid方法&&阻塞和非阻塞等待
文章目录(1)为什么子进程需要被等待(2)等待进程的方法A:wait方法B:waitpid方法C:进程非阻塞式等待前文说过,子进程被创建之后,父子进程究竟谁先运行是由调度器说了算。但是,谁先结束呢?一般来说肯定是要让子进程先结束,想一想我们的bash,bash是所有命令的父进程,你总不能让bash先挂吧其实之所以让子进程先退出,是因为父进程容易对子进程进行管理,而且子进程被创建的原因就是因为父进程想要让子进程帮助自己完成一些业务,因此它要拿到结果。因此父进程一般需要等待子进程(1)为什么子进程需要被原创 2021-04-27 08:56:56 · 620 阅读 · 0 评论 -
Linux系统编程18:超详解进程程序替换&exec函数的一些用法
文章目录(1)进程程序替换是什么(2)exec-替换函数(3)实例展示-了解exec函数的替换原理A:execl和execvB:execlp和execvpC:替换自己的程序和execleD:execve(1)进程程序替换是什么之前我们说过,子进程与父进程共享代码,也就是说代码是共有的,但是如果想要让子进程去执行另外的程序,而不是父进程原有的程序,该怎么办?所以要完成这样的操作,子进程就要调用名字叫作exec的函数(共有6个,都以exec开头)去执行另外一个程序, 进程调用exec函数时,该进程的用户空原创 2021-04-27 08:59:08 · 502 阅读 · 0 评论 -
Linux系统编程8-18总结项目:完成一个简单的自己的shell
文章目录一:进程创建(1)fork函数回顾(2)写时拷贝二:进程终止(1)进程终止时的三种情况一:进程创建(1)fork函数回顾在下面这篇文章我们演示了fork函数以及相关细节点击跳转还是借助上文中的程序和效果图片#include <stdio.h>#include <unistd.h>int main(){ printf("执行到fork函数之前其进程为:%d,其父进程为:%d\n",getpid(),getppid()); sleep(1);原创 2021-03-15 17:15:26 · 383 阅读 · 1 评论 -
Linux系统编程19:基础IO之了解Linux中的标准输入和输出以及相关的系统调用接口(如write,read等)
文章目录一:标准输入,标准输出和标准错误(1)回忆C语言写文件(2)stdin,stdout和stderr二:读写文件新的系统调用接口注意:库函数和系统调用接口的关系(1):open基本情况介绍(2):close基本情况介绍(3):read基本情况介绍(4):write基本情况介绍(5):演示一:标准输入,标准输出和标准错误(1)回忆C语言写文件学习C语言时,将数据写入到一个文件中可能会用到下面这种代码#include <stdio.h>#include <string.h>原创 2021-04-28 14:20:47 · 607 阅读 · 0 评论 -
Linux系统编程20:基础IO之从内核代码深刻理解Linux是如何管理文件及文件描述符的本质是什么
文章目录(1)文件描述符到底是什么A:输出描述符B:文件描述符(2)系统如何管理文件(3)一切皆文件(4)用源代码验证(5)FILE(1)文件描述符到底是什么A:输出描述符编写如下C语言文件,#include <fcntl.h>#include <unistd.h>#include <stdio.h>int main(){ int fd1=open("log1.txt",O_WRONLY);//打开错误 int fd2=open("log2.tx原创 2021-04-28 14:22:43 · 474 阅读 · 0 评论 -
Linux系统编程21:基础IO之全缓冲和行缓冲的区别及深刻理解缓冲区及其作用
文章目录(1)全缓冲和行缓冲(2)真正理解缓冲区(1)全缓冲和行缓冲一般来说,C库函数写入显示器属于行缓冲,也就是只要遇到一些标记,比如说’\n’就会立即刷新出去所以上面的例子中如果不关闭1号文件,并且每个字符串后面都显式的加了\n,那么现象就是所有的内容都被打印了C库函数写入文件时是全缓冲,也就是写满缓冲区才能刷新,如果发生重定向时(关闭1号文件)数据的缓冲方式就会由行缓冲变为全缓冲所以下面的例子中,关闭1号文件,此时内容被重定向到了文件当中,printf和fprintf都没有输出任何东西原创 2021-04-28 14:24:07 · 742 阅读 · 0 评论 -
Linux系统编程22:基础IO之掌握重定向的本质和使用dup2完成重定向
文章目录(1)总结(2)使用系统调用dup2完成重定向(1)总结从讲文件描述符开始,我们就引入了重定向的概念。读到这里,大家应该能够明白,重定向产生的原因就是文件描述符在分配时趋向于数值小的,而在用户层,stdout这个文件指针指向的文件已经封装了,并且它的fd就是1,这是不能修改的,所以我们一上来关闭了1号文件,然后新创建了一个文件它的文件描述符就会分配为被1,同时此时写入时,像printf这类函数默认使用的输出流就是stdout,但是我们知道它的1指向的已经是我们新生成的那个文件了,所以这就重定向的原创 2021-04-28 14:25:31 · 474 阅读 · 0 评论 -
Linux系统编程23:基础IO之了解硬盘物理和逻辑结构及明白inode的本质和掌握软硬链接及其区别
文章目录(1)硬盘的逻辑结构与物理结构A:物理结构B:逻辑结构(2)inodeA:inode是什么B:块组C:块中有什么D:创建,删除文件的本质E:目录的本质(3)软硬链接A:复习B:软硬链接对比C:链接数目的问题(1)硬盘的逻辑结构与物理结构文件,自然而然是存在于硬盘中的,所以想要说清楚文件系统,必然先要理解硬盘的逻辑结构与物理结构。由于这部分所涉及的内容非常复杂,所以叙述时以简洁明了为主,一些细节问题将忽略A:物理结构物理结构一般由磁头、盘片、电动机、主控芯片、排线、接口等部件组成1:磁头原创 2021-04-28 14:28:41 · 571 阅读 · 0 评论 -
Linux系统编程24:基础IO之在Linux下深刻理解C语言中的动静态库以及头文件和库的关系
文章目录七:动态库和静态库(1)什么是库(2)静态库和动态库初步认识A:静态库B:动态库C:头文件和库文件的关系七:动态库和静态库(1)什么是库库就是现有的,已经写好的可复用的代码。每个程序都要依赖很多基础的底层库,不可能每个人编写代码时都要从0写起(比如printf,scanf)本质上库是一种可执行代码的二进制形式,可以被操作系统载入内存。库主要分为静态库(.a .lib)和动态库(.so .dll)静态和动态指的就是链接。我们知道编译一个C程序需要经过预处理,编译,汇编和链接这4个步骤。在链接原创 2021-04-28 14:30:34 · 582 阅读 · 0 评论 -
Linux系统编程25:基础IO之亲自实现一个动静态库
文章目录一:标准输入,标准输出和标准错误(1)回忆C语言写文件(2)stdin,stdout和stderr二:读写文件新的系统调用接口注意:库函数和系统调用接口的关系(1):open基本情况介绍(2):close基本情况介绍(3):read基本情况介绍(4):write基本情况介绍三:文件描述符一:标准输入,标准输出和标准错误(1)回忆C语言写文件学习C语言时,将数据写入到一个文件中可能会用到下面这种代码#include <stdio.h>#include <string.h&g原创 2021-03-22 16:51:47 · 513 阅读 · 2 评论 -
Linux系统编程26:进程间通信之进程间通信的基本概念
文章目录(1)通信和独立性是否矛盾(2)进程间通信的目的(3)进程间通信的分类(1)通信和独立性是否矛盾前面在讲进程时,说到进程具有独立性,多个进程运行时独享自己的资源,互不干扰,而本章主题是进程间通信,且独立性体现的是数据的互不干扰,而通信则是数据的交互,这两点看起来确实是“矛盾”的,但是实则不然。之前所说的独立并不是完全独立,进程与进程之间也会产生协作关系,(2)进程间通信的目的数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享资源通知事件:一个进程需要向另一个或另原创 2021-04-29 14:53:25 · 472 阅读 · 0 评论 -
Linux系统编程27:进程间通信之管道的基本概念和匿名管道与命名管道及管道特性
文章目录(1)管道是什么(2)匿名管道A:读端和写端B:建立匿名管道的函数C:最简单的进程间通信-演示D:管道四大特性E:管道的特点F:从内核角度理解管道G:管道总结(3)命名管道A:命名管道和匿名管道的区别B:如何创建命名管道C:演示-管道实现服务端和客户端的通信(1)管道是什么管道是UNIX中一种古老的通信方式,管道本质其实是一个文件如上,命令行who的标准输出原本是屏幕,但是却输出到了管道文件中,发生了重定向,然后wc命令再从以管道文件作为标准输入,然后输出到屏幕中其中who | wc -l原创 2021-04-29 14:56:35 · 487 阅读 · 0 评论 -
Linux系统编程28:进程间通信之共享内存和相关通信接口(ftok,shmget,shmctl,shmat,shmdt)
管道的声明周期是随进程的,但是前面的演示中,大家可以发现虽然可执行文件也是一个进程,但是只要执行一遍后,它就会存在,除非系统重启或手动删除,说明共享内存的生命周期是跟随内核的。既然我们需要共享内存来帮助进程完成通信,那么必然要对共享内存进行相应的操作,操作系统也提供了相应的接口给我们,以便完成一些基础操作,涉及的操作主要会有。所以服务端一旦写入数据,客户端立马就可以看到,而不存在管道中的那种缓冲区导致发生发生多次拷贝的现象,所以共享内存也是最快的进程间通信的方式。大家需要明白的一点是,原创 2021-04-04 22:21:59 · 673 阅读 · 0 评论 -
Linux系统编程29:进程信号之什么是信号及signal函数
文章目录(1)CTRL+C(2)注意(3)信号列表(4)处理信号-signal函数(1)CTRL+C我们都知道,按下ctrl+c后将会结束当前运行的一个前台进程,当我们按下ctrl+c后,会被操作系统获取,而这个动作或者这个快捷键组合已经被赋予了结束进程的含义(就像你从小就被告知看见红灯就要停下来),它被解释为信号,发送给目标前台进程,而进程由于收到了信号所以退出其中2号信号KILLINT发挥的作用就是ctrl+c,如下可以一个进程不断地向屏幕打印文字,然后使用2号信号结束(2)注意ctrl+原创 2021-04-29 21:38:22 · 594 阅读 · 0 评论 -
Linux系统编程30:进程信号之产生信号的四种方式(Core Dump,kill,raise)
文章目录(1)通过按键产生信号-Core Dump(2)调用系统函数向进程发送信号A:killB:raiseC:abort(3)由软件条件产生信号(4)硬件异常产生信号总结:为了方便后面的讲解,我们先要了解一下如何捕捉信号,使用signal函数可以捕捉到发送给这个进程的信号,该函数第一个形参设定要捕捉的信号,第二个形参实则是一个函数指针,指向了一个函数,表明当捕捉到要捕捉的信号时,所要进行的操作#include <stdio.h>#include <unistd.h>#inc原创 2021-04-29 21:39:49 · 778 阅读 · 0 评论 -
Linux系统编程31:进程信号之什么是信号的阻塞及相关术语(递达,未决,pending位图,handler位图)
文章目录(1)信号相关术语(2)信号在内核中的表示前面说过,操作系统发出信号之后,对于进程有可能不是立马就处理的,所以如果不是立即处理,那么在这个空档期间进程究竟对信号做了怎样的处理呢?(1)信号相关术语为了表示清楚,这里总结关于信号的一些术语递达(Delivery):进程执行信号的处理动作信号未决(Pending):信号从产生到递达之间的状态阻塞(Block):进程可以选择对信号进行阻塞,被阻塞的信号产生时将保持在未决状态,知道进程解除对此信号的阻塞,才会执行递达动作需要注意区分阻塞和忽原创 2021-04-29 21:41:47 · 551 阅读 · 0 评论 -
Linux系统编程32:进程信号之详解信号集操作函数(sigset_t ,sigpending,sigprocmask)
文章目录(1)sigset_t(2)信号集操作函数(1)sigset_t前面说过,未决和阻塞分别用位图来表示,于是我们把保存位图这样的数据类型称为sigset_t,sigset_t称为信号集,于是他们分别称为阻塞信号集和未决信号集sigset_t这种类型可以表示每个信号的有效和无效的状态(阻塞信号集的有效和无效的含义是该信号是否被阻塞,未决信号集则是该信号是否处于未决状态),其中阻塞信号集也叫做当前进程的信号屏蔽字(SignaL Mask)(2)信号集操作函数sigset既然是一个保存位图的数据类原创 2021-04-29 21:47:47 · 1173 阅读 · 0 评论 -
Linux系统编程33:进程信号之详解信号的捕捉过程,用户态和内核态及其切换,sigaction和signal
文章目录(1)用户态和内核态(2)用户态和内核态的切换(3)内核是如何实现信号的捕捉(4)sigaction(1)用户态和内核态我们说过,每个Linux进程有4GB的地址空间其中0-3G是用户空间,由用户页表负责映射到物理内存,剩余的1G存放的是内核及其维护的数据,由内核页表负责映射。一个非常简单的C语言程序如下#include <stdio.h>int main(){ int a=10; printf("%d\n",a); return 0;}这段程序中有一个pri原创 2021-04-29 21:51:16 · 591 阅读 · 1 评论 -
Linux系统编程34:进程信号之可重入函数,volatile关键字的作用和SIGHLD
文章目录一:信号简介(1)CTRL+C(2)注意(3)信号列表(4)处理信号二:产生信号(1)通过按键产生信号(2)调用系统函数向进程发送信号A:killB:raiseC:abort(3)由软件条件产生信号(4)硬件异常产生信号一:信号简介(1)CTRL+C我们都知道,按下ctrl+c后将会结束当前运行的一个前台进程,当我们按下ctrl+c后,会被操作系统获取,而这个动作或者这个快捷键组合已经被赋予了结束进程的含义(就像你从小就被告知看见红灯就要停下来),它被解释为信号,发送给目标前台进程,而进程由于原创 2021-04-13 15:38:23 · 2183 阅读 · 3 评论 -
Linux系统编程35:多线程之如何理解Linux中的线程以及轻量级进程LWP
文章目录(1)由“进程”到进程(2)进程,线程和轻量级进程A:进程和线程的关系B:Linux中没有真正意义上的线程C:轻量级进程-LWP(3)线程的优缺点A:优点B:缺点(4)线程vs进程(1)由“进程”到进程前面说过,在Linux中创建一个进程通常会包含以下操作创建进程所需要的一系列数据结构(比如经典的task_struct,mm_struct,也就是地址空间等)为它开辟物理内存,把代码和数据加载进物理内存创建页表,负责映射········如果再创建一个进程,无非就是重复上面的操作而已,原创 2021-04-30 22:24:11 · 555 阅读 · 2 评论 -
Linux系统编程36:多线程之线程控制之pthread线程库(线程创建,终止,等待和分离)
文章目录(1)POSIX线程库(2)pthread_create——创建线程A:关于Linux线程的再理解B:线程ID及地址空间布局(3)pthread_exit——线程终止(4)pthread_join——线程等待(5)pthread_detach——线程分离(1)POSIX线程库前面说过,在Linux中是用进程模拟线程的,所以就不会用形如fork()这类的系统调用提供给我们用来专门控制线程。所以要实现多线程,就要使用到库函数,这里面比较底层的是POSIX线程库,所以它就是产生的就是用户级别的线程,其原创 2021-04-30 22:27:03 · 694 阅读 · 1 评论 -
Linux系统编程37:多线程之什么是临界区和临界资源以及如何使用mutex互斥锁
文章目录(1)临界区,临界资源和原子性问题(2)互斥量(锁)A:互斥锁B:锁的作用C:互斥锁实现的原理(3)可重入函数和线程安全A:可重入函数和线程安全B:常见的线程安全和不安全情况C:常见可重入和不可重入的情况(4)死锁A:死锁的概念B:死锁的四个必要条件C:解决死锁的方法(1)临界区,临界资源和原子性问题临界资源:多线程执行流共享的资源叫做临界资源(一般是被访问的共享资源)临界区:每个线程内部,访问临界资源的代码,叫做临界区原子性:一件事情要么完成,要么不完成,不要出现模棱两可的情况如下有原创 2021-04-30 22:29:01 · 1319 阅读 · 5 评论