- 博客(12)
- 收藏
- 关注
原创 Linux进程控制
原因是程序里的父进程的父进程是当前终端,父进程在终端前台输出结束后,回到了终端前台。命令手动杀死子进程,wait函数一旦发现子进程结束了,就回收这个子进程,如果所有子进程全部结束了,那么就返回-1,同时通过wait的传出参数,我们可以获得退出的状态。C库和Linux系统都提供了进程退出函数exit()和_exit(),exit()在_exit()的基础上还进行了刷新缓冲区,关闭文件描述符等操作。因为父进程已经没法回收这个子进程了,所以我们可以选择杀死父进程,然后交给init进程来领养善后。
2022-12-12 10:59:44
246
1
原创 exec函数族
exec 函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,换句话说,就是在调用进程内部执行一个可执行文件。exec 函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程 ID 等一些表面上的信息仍保持原样,颇有些神似“三十六计”中的“金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回 -1,从原程序的调用点接着往下执行。
2022-12-10 10:26:41
381
原创 父子进程关系及GDB多进程调试
系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构模型。使用函数创建子进程在虚拟地址空间的视角下,fork()函数相当于把父进程的虚拟地址空间clone给子进程。fork()以后,子进程用户区数据和父进程一样。内核区也会拷贝过来,但是pid,ppid和fork()函数返回值不一样。但是两个虚拟地址空间是相互独立的,可以看到num的计算是没有任何影响的分开计算的实际上,更准确来说,Linux 的 fork() 使用是通过写时拷贝 (copy- on-write) 实现
2022-12-06 21:44:56
707
原创 Linux进程状态转换
进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即就绪态,运行态,阻塞态。在五态模型中,进程分为新建态、就绪态,运行态,阻塞态,终止态。命令的瞬间的进程信息,并非动态的进程所属用户进程的IDCPU的使用内存的使用是常驻内存集(Resident Set Size),表示该进程分配的内存大小表示进程分配的虚拟内存进程所属的终端状态父进程的ID进程组的ID会话的ID开始的时间持续的时间执行哪个命令产生的这个进程杀
2022-12-05 13:57:53
556
原创 Linux进程概述
程序是包含一系列信息的文件,这些信息描述了如何在运行时创建一个进程:为了管理进程,内核必须对每个进程所做的事情进行清楚的描述。内核为每个进程分配一个 PCB(Processing Control Block)进程控制块,维护进程相关的信息,Linux 内核的进程控制块是 task_struct 结构体。里面主要有这些内容:使用可以查看资源上限如果要修改打开文件个数话可以使用,如果改别的,那就使用对应的字母。
2022-12-05 13:08:08
162
原创 文件IO学习
标准C库IO函数的核心在于缓冲区,如果直接用Linux系统内核的read和write函数,每次读写都要重新访问一次磁盘,访问磁盘需要花费很多时间,IO的缓冲区很大程度减少了对磁盘的访问次数,提高了read和write函数的使用效率。stat和lstat的区别是,如果b.txt链接到a.txt那么stat获取的是a.txt的信息,而lstat获取的是b.txt的信息,也就是链接的信息。第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。
2022-12-02 21:29:02
509
原创 GDB调试
选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证 gdb 能找到源文件。GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多类 Unix 系统中的标准开发环境。若一个程序有好几个文件组成,当我们调试主函数所在程序时,其他文件的代码也需要查看,就可以使用上述命令。如果不设置断点,程序会执行到最后,此时我们设置几个断点,再执行。
2022-11-11 13:01:12
287
原创 Makefile学习
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就像一个 Shell 脚本一样,也可以执行操作系统的命令。Makefile 带来的好处就是“自动化编译” ,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。
2022-11-08 15:02:58
228
原创 Leetcode 239. 滑动窗口最大值
首先要明确的是,题解中单调队列里的pop和push接口,仅适用于本题。单调队列不是一成不变的,而是不同场景不同写法,总之要保证队列里单调递减或递增的原则,所以叫做单调队列。不要以为本题中的单调队列实现就是固定的写法。C++中deque是stack和queue默认的底层实现容器,deque是可以两边扩展的,而且deque里元素并不是严格的连续分布的。
2022-11-06 20:02:46
241
原创 静态库与动态库学习
库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。库的好处:1.代码保密 2.方便部署和分发。
2022-11-06 15:31:46
284
原创 优先级队列
priority_queue又称为优先队列,其底层是用堆来进行实现的。在优先队列中,队首元素一定是当前队列中优先级最高的那一个(默认是大根堆)。和队列不一样的是,优先队列没有front()和back()函数, 而只能通过top()函数来访问队首元素(也可以称为堆顶元素),也就是优先级最高的元素。
2022-11-05 10:35:45
344
原创 GCC学习
GCC(GNU Compiler Collection,GNU编译器套件)是由 GNU 开发的编程语言译器。GNU 编译器套件包括 C 、 C++ 、 Objective C 、 Java 、 Ada 和 Go 语言前端,也包括了这些语言的库(如 libstdc libgcj 等)GCC 不仅支持 C 的许多“方言”,也可以区别不同的 C 语言标准;可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个 C 标准。
2022-11-04 19:55:55
102
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人