- 博客(122)
- 收藏
- 关注
原创 Linux系统编程——system函数和popen函数的使用方法以及区别
在Linux系统编程中,system函数是一个非常常用的函数,它的作用是执行一个命令(通常是 shell 命令)。我们来逐步解读system函数。参数command是要执行的命令,通常是字符串形式的 shell 命令(例如:"ls", "echo Hello")。返回值:函数执行后返回一个整数,表示命令的执行结果:如果命令执行成功,返回命令的退出状态。如果命令执行失败,返回-1,并且设置errno来指示错误的原因。与system函数类似,popen。
2025-05-18 13:54:20
663
原创 Linux系统编程——exec族函数
exec一般情况用不到,仅当你要给新程序指定新的环境变量时才用。exec系列函数是“把自己变成另一个程序”的魔法。不创建新进程,而是“换皮重生”;常用execlp()和execvp();一定配合fork()使用,否则你原来的程序会消失。
2025-05-16 21:57:36
865
原创 Linux系统——进程结束时退出的分析与总结(关于wait与waitpid函数)
当子进程退出了,但父进程没来处理它的退出状态,它就会“挂”在系统里,状态为Z(Zombie)。不会占用内存,但会占用进程号(PID);如果大量僵尸进程存在,系统可能无法创建新进程。| 进程开始运行 |v| return / exit() |←—— 正常退出v| 系统清理资源 || 回收文件/内存等 |v| 父进程通过 wait() || 获取退出状态 |五、退出码当一个进程结束时,它会向操作系统“上交”一个退出状态值(退出码)
2025-05-15 20:44:05
1049
原创 Linux系统编程——vfork函数的使用方法以及与fork函数的区别
vfork()vfork()是为了性能优化而设计的系统调用,用于在不复制地址空间的前提下创建子进程。它只能用于非常有限的场景(创建子进程后立即执行exec或_exit()),不适用于通用进程创建。与fork()相比,vfork()更快但更危险。在现代 Linux 中,因为fork()使用写时复制技术,差距已不大。如果你只想简单安全地创建子进程,请使用fork()。只有在明确知道限制条件、并追求极致性能时,才考虑使用vfork()。
2025-05-15 17:51:01
665
原创 Linux系统编程——fork函数的使用方法
返回值如果 fork()调用成功,父进程返回子进程的 PID(正整数),子进程返回 0。如果调用失败,返回 -1,错误信息可以通过errno获取。PID(进程标识符)父进程可以通过返回值得到子进程的 PID。子进程的 PID 是由操作系统自动分配的。子进程的资源子进程从父进程复制了几乎所有的资源,包括内存、文件描述符、环境变量等。子进程有自己的地址空间,与父进程独立运行。fork()用于创建一个新的子进程,父进程和子进程从fork()返回的地方开始继续执行。父进程和子进程在fork()
2025-05-14 22:00:38
964
原创 Linux系统编程——从内存空间看fork创建进程后到底发生了什么
fork()是一个系统调用,它的作用是在调用它的进程(父进程)中创建一个几乎完全相同的新进程(子进程)。在fork()调用之后,父进程和子进程会继续执行相同的代码,返回值不同:fork()返回子进程的进程 ID(PID)。fork()返回 0。fork()调用后,父子进程的代码和数据(如全局变量、堆、栈等)会被复制到子进程中,但它们是独立的,可以分别修改。在fork()调用后,父进程和子进程拥有几乎相同的内存空间,但它们的内存是独立的,采用写时复制(COW)技术来减少内存复制的开销。
2025-05-14 13:32:26
1281
原创 C程序的存储空间分配
区域存储内容特点代码区程序的指令(如main函数中的代码)只读,防止代码修改数据区初始化的全局变量和静态变量程序启动时加载,存储已初始化的数据BSS 区域未初始化的全局变量和静态变量在程序启动时会自动初始化为 0堆区动态分配的内存(如通过malloc程序动态分配和管理,开发者需要负责释放内存栈区局部变量、函数的返回地址、参数等按照后进先出的顺序管理内存C 程序的内存分配是由操作系统根据不同的数据类型和作用域来决定的。代码区:存储程序的指令代码。数据区:存储已初始化的全局变量和静态变量。
2025-05-13 21:54:39
782
原创 Linux系统编程——进程
程序是指一组有序的指令,它们被设计来执行某些特定的任务。程序通常是静态的,存储在硬盘上(或其他介质上)作为一个可执行文件。程序是静态的:它只是一个存储在存储介质上的代码文件,包含了编译后的指令,可以是.exe.out.bin等格式。程序不执行任何操作:它只是一个包含逻辑和计算步骤的集合,直到被加载到内存中并被操作系统执行时,才变得有用。进程是程序在计算机上执行时的一个实例,或者说是程序的执行过程。它是操作系统资源管理的基本单位。
2025-05-13 21:50:48
715
原创 Linux文件编程——标准库函数(fopen等)和系统调用函数(open等)的区别
标准库函数提供了高层次的接口,便于开发者进行日常文件操作,自动管理缓冲区,适合大多数场景。系统调用提供了底层的控制能力,适用于需要更高性能或更细粒度控制的应用。
2025-05-13 20:43:01
796
原创 Linux文件编程——标准库函数fopen、fread、fwrite等函数的使用方法及注意事项
fopen:用于打开文件,返回文件指针,可以设置文件的打开模式。fread:用于从文件中读取数据,适用于读取二进制数据。fwrite:用于将数据写入文件,适用于写入二进制数据。fseek:用于设置文件指针的位置,可以在文件内部进行定位。fclose:关闭文件,释放资源,确保数据写入完成。fputc:用于写入单个字符,适合逐个字符地写入文件。如果要写入多个字符,可以多次调用fputc,或者使用fwrite。fgetc:用于读取单个字符。返回值是一个int类型,用于区分普通字符与EOF(文件结束符)。feof。
2025-05-13 18:47:06
881
原创 Linux文件编程——实现cp命令
argc:参数数量(计数),始终 ≥1。argv:参数值的字符串数组,以NULL结尾。argc和argv是命令行工具的核心接口:它们让程序能够接收用户输入的文件路径和选项。没有这些参数,程序无法动态处理文件cp必须知道源文件和目标文件的位置,而这些信息只能通过命令行参数传递。后续的文件操作(如open()read()write())依赖这些参数:路径字符串直接来自argv,参数检查依赖argc。
2025-05-13 11:23:32
361
原创 Linux文件编程:操作流程与内核机制
Linux 文件编程不仅仅涉及如何使用高层的标准库函数,还需要深入理解文件系统的工作原理以及内核如何处理文件操作请求。从用户空间到内核空间的请求传递、VFS 的统一接口、实际文件系统的实现,到存储设备的底层交互,每一步都涉及到复杂的数据结构和机制。掌握 Linux 文件编程,特别是如何利用系统调用与文件系统进行交互,将帮助你深入理解操作系统的底层运作,提升你在系统级编程中的能力。通过本篇总结,希望你能对 Linux 文件系统的工作机制有更加清晰的认识,从而更好地进行文件操作和开发。
2025-05-12 15:53:06
737
原创 Linux文件编程——read函数与lseek函数
函数是一个系统调用,用于从文件描述符(File Descriptor)指向的文件或设备中读取数据到缓冲区。它是 Unix/Linux 系统编程中实现底层 I/O 操作的核心函数之一。:通过定位到文件的任意位置进行读写。可以避免不必要的顺序读取,提高效率。例如,在数据库文件中,通过。操作可能会读取到错误的数据或返回错误。,可以高效、可靠地完成文件 I/O 操作。直接定位到指定记录的起始位置进行读写操作。函数的详细使用方法和注意事项。函数会更新文件的当前偏移量,而。在 Linux 文件编程中,
2025-05-12 14:10:26
681
原创 Linux文件编程——write函数
函数是一个系统调用,用于将数据从缓冲区写入文件描述符(file descriptor)指向的文件或设备。它是 Unix/Linux 系统编程中非常重要的底层 I/O 操作之一。,可以高效、可靠地完成文件 I/O 操作。在 Linux 文件编程中,
2025-05-12 13:34:33
513
原创 Linux文件编程——open函数
系统调用(System Call)是应用程序与操作系统内核之间的交互方式。用户程序通过系统调用请求操作系统的服务,这些服务通常涉及硬件资源的访问,如文件读写、网络通信、进程控制等。操作系统会提供一个封装好的接口供程序员使用,从而使得程序能够在不直接操作硬件的情况下,依然能够进行诸如文件操作等任务。
2025-05-11 20:54:57
715
原创 Linux 文件编程入门
在 Linux 系统中,一切皆文件:普通文本、图片、设备、套接字、甚至键盘和鼠标等都被抽象为文件。文件编程就是通过程序对这些“文件”进行操作(如打开、读取、写入、关闭等),实现数据的存储与交互。│ 用户空间应用程序 ││ (如:使用 fopen、read 等) │▼。
2025-05-11 15:48:16
822
原创 Linux环境下基于Ncurses开发贪吃蛇小游戏
贪吃蛇的撞墙一般出现在移动后的情况下,那么我们需要在移动后加一个判定,判定移动后的贪吃蛇的尾巴节点的行和列是否等于地图边界的值,如果相等就判定撞墙,重新初始化地图界面,释放原链表的节点,避免内存浪费。我们在前边提到过,贪吃蛇的移动是根据更新其尾巴节点的方法来实现的,那么,要实现其上下左右移动我们就可以通过ncurses获取用户的上下左右按键的输入,根据输入来调整贪吃蛇链表的尾巴节点的行列值实现。我们使用了[ ]表示的贪吃蛇的身子,在这里我们考虑继续使用这个结构体,来表示贪吃蛇的食物,并且使用##表示食物。
2025-05-10 12:42:28
1209
原创 线程锁入门笔记(以贪吃蛇为例)
进程是操作系统分配资源的基本单位。每个进程都具有独立的内存空间、代码段、数据段等资源。进程之间不能直接访问对方的内存。进程与线程:进程是操作系统的资源分配单位,而线程是进程中的执行单元,多个线程可以共享同一进程的资源。为什么需要线程锁:当多个线程共享资源时,可能会发生竞态条件或资源冲突。线程锁能确保同一时刻只有一个线程访问共享资源,从而避免数据不一致。互斥锁的使用:通过,我们可以在多线程中保护共享资源,避免冲突。常用的操作包括初始化、加锁、解锁和销毁。在贪吃蛇项目中的应用:通过在多个线程访问ncurses。
2025-05-10 10:23:35
1202
原创 Linux C语言线程编程入门笔记
本文介绍了在Linux环境下使用C语言进行多线程编程的基础知识。首先,开发环境需要安装GNUC编译器和POSIX线程库,并通过gcc -pthread选项进行编译。线程是程序执行的最小单位,属于进程,多个线程共享进程的内存空间,但各自拥有独立的寄存器和栈空间。线程的生命周期包括新建、就绪、运行、阻塞/等待和终止等状态。创建线程使用pthread_create()函数,主线程可以通过pthread_join()等待子线程结束。线程函数必须符合void* func(void* arg)的形式,参数通过void*
2025-05-09 19:50:09
751
原创 C语言多线程编程深度解析
通过系统学习线程创建、同步机制、资源管理等核心概念,结合示例代码实践,可显著提升多线程程序的健壮性和性能。建议使用现代调试工具如GDB和Helgrind进行并发调试。线程是操作系统调度的最小单位,共享进程资源但拥有独立栈空间。多线程编程可有效提升CPU利用率,特别适合I/O密集型任务。
2025-05-09 12:27:18
239
原创 Linux系统下使用ncurses获取按键
通过上述步骤,你可以在Linux系统下使用ncurses库轻松捕获并处理上下左右方向键的输入。ncurses库提供了强大的功能,使得在终端中构建文本用户界面变得简单和直观。
2024-10-18 17:35:30
416
原创 Linux系统下Ncurses的安装与使用
Ncurses是一个用于构建文本用户界面(TUI)的库。它是Curses库的一个更现代、功能更丰富的实现,Curses库最初是为Unix系统设计的,用于在字符终端上提供基本的文本界面功能。使用Ncurses,我们可以创建多窗口的文本界面,控制文本的输出格式(如加粗、下划线、颜色等),。这使得Ncurses成为开发命令行界面应用程序的理想选择,尤其是在需要复杂交互或图形化元素的情况下。
2024-10-18 11:06:43
2098
原创 简述Linux和RTOS
在设计RTOS内核时,开发者需要仔细考虑系统的实时性要求,以及如何在资源受限的嵌入式设备上实现高效的任务调度和管理。实时操作系统(Real-Time Operating System,简称RTOS)内核是专为实时系统设计的操作系统核心,它能够确保在规定的时间内对事件做出响应。:Linux 是开源的,许多 RTOS 也是开源的,如 FreeRTOS,这使得开发者可以自由地查看、修改和分发源代码。:RTOS 内核必须能够在确定的时间内完成指定的任务,这意味着系统对任务的响应时间是可以预测的。
2024-10-17 19:54:44
2119
原创 C语言——头插法和尾插法动态创建链表
在C语言中,动态创建列表通常指的是使用链表(Linked List)这种数据结构。链表由一系列节点(Node)组成,每个节点包含数据部分和指向下一个节点的指针。根据插入节点的位置不同,链表的插入操作可以分为头插法和尾插法。下面将详细介绍这两种方法。
2024-10-17 19:09:32
1319
原创 linux——vim编辑器的常用操作指令以及快捷键
在Linux中,Vim是一款功能强大的文本编辑器,掌握其常用的操作指令和快捷键对于提高文本编辑效率至关重要。以下是对Vim编辑器常用的详细操作指令以及快捷键的归纳:Vim有多种模式,其中最常用的是正常模式(Normal Mode)、插入模式(Insert Mode)和可视模式(Visual Mode)。基本移动:h向左移动一个字符,j向下移动一行,k向上移动一行,l向右移动一个字符。快速移动:翻页:Ctrl+f向下翻页,Ctrl+b向上翻页,Ctrl+u向上滚动半页,Ctrl+d向下滚动半页。删除:复制:粘
2024-10-15 15:14:47
1286
原创 Linux——虚拟机网络配置
进行虚拟机网络配置是确保虚拟机能够正常访问网络、与宿主机及其他设备进行通信的关键步骤。虚拟机网络配置允许用户根据实际需求选择合适的网络模式,并调整网络参数以满足特定的网络环境要求。
2024-09-23 19:09:08
2989
1
原创 Linux——虚拟机和Windows间的文件传输方式
Linux虚拟机和Windows间的文件传输方式多种多样,每种方式都有其特定的适用场景和操作步骤。
2024-09-23 18:02:58
5692
原创 Linux——常用系统设置和快捷键操作指令
xandr命令会显示你所支持的所有分辨率。选择你要使用的分辨率,以1680x1050为例,使用命令。在Linux系统中,有许多快捷键和命令可以提高你的工作效率。2.终端打开快捷键:ctrl+alt+T。ctrl+alt++:字体变大。ctrl+ -:字体变小。命令框大小可直接拖拽。
2024-09-20 16:44:38
1025
2
原创 Linux——创建编写并编译一个C程序
这就是在Linux系统下,使用vim编辑器创建、编写并编译一个C程序的全过程。vim是一个功能强大的文本编辑器,通过掌握它的基本命令和快捷键,你可以更加高效地编写和编辑代码。此外,GCC是C语言编程中常用的编译器之一,它能够将C源代码编译成可执行文件。二、使用nano编辑器在Linux系统下创建、编写并编译一个C程序是一个相对直接的过程。我们将创建一个简单的C程序,该程序的功能是输出“Hello, World!”到终端。以上就是在Linux系统下创建、编写并编译一个C程序的基本步骤。
2024-09-20 15:09:58
2917
原创 博弈论模型
博弈论,又被称为对策论或赛局理论,是现代数学的一个新分支,也是运筹学的一个重要学科。它主要研究公式化了的激励结构(即游戏或博弈)间的相互作用,是研究具有斗争或竞争性质现象的数学理论和方法。
2024-09-14 11:22:50
809
原创 Python——模块和包
除了Python标准库中的模块外,你还可以创建自己的模块。只需编写一个.py文件,并在其中定义所需的函数、类和变量即可。然后,你可以在其他Python程序中使用import语句来导入这个模块,并使用其中定义的内容。
2024-08-30 16:33:37
1404
原创 Python——造物者type( )、元类与抽象基类
定义type()函数是Python的一个内置函数,用于获取一个对象的类型信息。基本用途:主要用于确定变量或对象的数据类型,以便进行类型检查或转换等操作。type()函数在Python中扮演着举足轻重的角色,它不仅是获取对象类型信息的工具,还是实现动态编程和元编程的重要手段。通过深入理解type()函数的前因后果和内部机制,我们可以更加灵活和高效地利用Python的强大功能。元类本身也是类,但它们与普通类的区别在于它们被用来创建类。在Python中,所有的类默认都是由type这个元类创建的。
2024-08-30 15:20:11
1988
原创 Python——property函数、类方法和静态方法以及描述符
counter = 0 # 类变量cls.counter += 1 # 修改类变量# 调用类方法MyClass.increment() # 输出: Counter is now: 1MyClass.increment() # 输出: Counter is now: 2在这个例子中,increment是一个类方法,它通过装饰器来定义。这个方法简单地递增了类变量counter的值,并打印出当前的计数值。注意,由于这是一个类方法,它接收cls。
2024-08-30 10:18:31
1340
原创 Python——使用__iter__和__next__实现迭代器
方法是Python中的一个特殊方法(也称为魔法方法或双下划线方法),它允许对象使用类似字典键(对于映射类型)或索引(对于序列类型)的语法来访问其项。在大多数情况下,迭代器对象就是实现了迭代器协议的对象自身,这意味着同一个对象既是可迭代的(实现了。这两个方法一起工作,使得Python的迭代器能够以统一的、可预测的方式遍历集合中的元素。迭代器是Python中一种强大的工具,它们提供了一种灵活的方式来遍历集合中的元素,同时支持延迟计算和节省内存。方法,可以创建自己的迭代器类,以支持对自定义数据结构的迭代操作。
2024-08-29 11:15:13
1328
原创 Python——魔法方法
实际上,Python提供了许多其他的魔法方法,它们可以覆盖几乎所有的Python内置操作。Python的魔法方法(也称为特殊方法或双下划线方法)是Python的内置方法,它们在类定义中用于执行特定的操作,如对象创建、属性访问、比较、序列化等。但是,需要注意的是,是两个特殊的魔法方法(也称为特殊方法或双下划线方法),它们在类的实例化过程中和对象销毁时分别扮演着重要的角色。装饰器,但它在行为上类似于静态方法),它在类的实例创建时首先被调用。方法的调用时机是不确定的,特别是在涉及循环引用和垃圾回收机制时。
2024-08-28 16:13:13
939
原创 Python——私有变量和slots类
时,这被视为一个约定,表明该属性是“受保护的”或“私有的”,旨在表明这个属性或方法主要是为了类的内部使用,而不是在类的外部直接访问的。)前缀的命名方式来创建“魔法”属性或方法,这些属性或方法会被Python的名称改写机制(name mangling)自动修改名称,使得它们几乎不可能从类的外部直接访问。事实上Python也正是通过修改变量的名称使其不能按照原本名称进行访问,从而达到私有变量的作用,而这种改名称也是有规律的,但是,Python提供了一种约定俗成的方式来模拟私有变量的行为,即使用单个下划线(
2024-08-28 11:11:37
648
原创 Python——Mixin设计模式
Mixin类通常命名时带有Mixin后缀,但这并不是强制的,只是为了在代码中清楚地表明其作为Mixin的用途。"""返回创建时间""""""返回更新时间""""""设置时间戳"""
2024-08-28 10:27:29
664
1
Linux环境下基于Ncurses开发简易贪吃蛇小游戏
2025-05-10
工程伦理分析PPT-大众汽车排放门事件
2024-07-12
机器视觉-传统相机标定法、线性求解P矩阵代码
2024-07-12
机器视觉-双目测量、极线表示、基本矩阵求解代码
2024-07-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人