嵌入式Linux系统编程
文章平均质量分 92
嵌入式Linux系统编程
几度春风里
几度春风里,看花谢花开,含羞的程序员,惹人爱!
展开
-
嵌入式Linux系统编程 — 7.4 fork、vfork函数创建子进程
虽然 vfork()系统调用在效率上要优于 fork(),但是 vfork()可能会导致一些难以察觉的程序 bug,所以尽量避免使用 vfork()来创建子进程,虽然 fork()在效率上并没有 vfork()高,但是现代的 Linux 系统内核已经采用了写时复制技术来实现 fork(),其效率较之于早期的 fork()实现要高出许多,除非速度绝对重要的场合,我们的程序当中应舍弃 vfork()而使用 fork()。在一个大型的应用程序任务中,创建子进程通常会简化应用程序的设计,同时提高了系统的并发性。原创 2024-07-08 20:56:52 · 839 阅读 · 0 评论 -
嵌入式Linux系统编程 — 7.3 进程的内存布局与虚拟内存空间
在 Linux 系统中,采用了虚拟内存管理技术,进程的虚拟地址空间是操作系统为每个进程提供的一段连续的、私有的内存区域。虚拟地址空间使得每个进程都像是在独立的内存中运行,隔离了不同进程的内存访问,提高了系统的稳定性和安全性。在 32 位系统中,每个进程的逻辑地址空间均为 4GB, 这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间,而内核独自享有剩下的 1G 空间,如下所示:虚拟内存是操作系统通过内存管理单元(MMU)将虚拟地址映射到物理地址的技术。原创 2024-07-07 16:56:36 · 579 阅读 · 0 评论 -
嵌入式Linux系统编程 — 7.2 进程的环境变量
每一个进程都有一组与其相关的环境变量, 这些环境变量以字符串形式存储在一个字符串数组列表中,把这个数组称为环境列表。其中每个字符串都是以“名称=值(name=value)” 形式定义,所以环境变量是“名称-值”的成对集合。譬如在 shell 终端下可以使用env 命令查看到 shell 进程的所有环境变量,如下所示:export LINUX_TEST=123456 # 添加 LINUX_TEST 环境变量使用"export -n LINUX_TEST"命令则可以删除 LINUX_TEST 环境变量。原创 2024-07-06 17:29:54 · 644 阅读 · 0 评论 -
嵌入式Linux系统编程 — 7.1 深入理解进程
进程是操作系统进行资源分配和调度的一个独立单位,每个进程都有自己的独立内存空间,至少有一个线程,即主线程。进程号(PID)是操作系统分配给每个运行中的程序的唯一标识符,它允许系统和用户识别和管理不同的进程,确保每个进程都能独立地运行并访问系统资源。:线程是进程中的一个执行流,是CPU调度和分派的基本单位,它被包含在进程之中,进程包含一个或者多个线程。函数开始执行时,它实际上是在进程的上下文中运行的,进程是操作系统分配资源和调度任务的基本单位。在Linux中,每个运行的程序都是一个或多个进程,当。原创 2024-07-05 11:18:17 · 846 阅读 · 0 评论 -
嵌入式Linux系统编程 — 6.7 实时信号
等待信号集只是一个掩码,它并不追踪信号的发生次数。这意味着,如果相同的信号在被阻塞的状态下多次产生,它只会在信号集中被记录一次,并且在信号集被检查时仅被视为一个事件。这是标准信号的缺点之一。与标准信号不同,实时信号可以排队,如果同一个实时信号多次发送给同一个进程,它们将被排队处理,而不是像标准信号那样只能触发一次。可排队: 实时信号可以排队等待处理,如果一个信号多次到达,它只会被处理一次,除非它被显式地从队列中移除并重新发送。优先级队列: 实时信号具有与信号相关联的默认实时优先级。原创 2024-07-05 00:02:19 · 1038 阅读 · 0 评论 -
嵌入式Linux系统编程 — 6.6 信号掩码
信号掩码(Signal Mask)是操作系统中用于控制进程接收信号的一种机制。每个进程都有一个或多个信号掩码,它们定义了哪些信号在特定时间被阻塞(即暂时忽略),哪些信号可以被进程接收。当应用程序调用 signal()或 sigaction()函数为某一个信号设置处理方式时,进程会自动将该信号添加到信号掩码中, 这样保证了在处理一个给定的信号时,如果此信号再次发生,那么它将会被阻塞;原创 2024-07-04 17:16:54 · 613 阅读 · 0 评论 -
嵌入式Linux系统编程 — 6.5 获取信号的描述信息
在 Linux 下,每个信号都有一串与之相对应的字符串描述信息,用于对该信号进行相应的描述。这些字符串位于 sys_siglist 数组中, sys_siglist 数组是一个 char *类型的数组,数组中的每一个元素存放的是一个字符串指针,指向一个信号描述信息。原创 2024-07-04 15:57:01 · 520 阅读 · 0 评论 -
嵌入式Linux系统编程 — 6.4 信号集
。原创 2024-07-04 12:38:42 · 614 阅读 · 0 评论 -
嵌入式Linux系统编程 — 6.3 kill、raise、alarm、pause函数向进程发送信号
pid: 参数 pid 为正数的情况下,用于指定接收此信号的进程 pid;除此之外,参数 pid 也可设置为 0 或-1 以及小于-1 等不同值。pid取值含义正数则信号 sig 将发送到 pid 指定的进程0则将 sig 发送到当前进程的进程组中的每个进程-1则将 sig 发送到当前进程有权发送信号的每个进程,但进程 1(init)除外小于-1将 sig 发送到 ID 为-pid 的进程组中的每个进程,原创 2024-07-02 16:36:30 · 911 阅读 · 0 评论 -
嵌入式Linux系统编程 — 6.2 signal和 sigaction信号处理函数
signal()函数是 Linux 系统下设置信号处理方式最简单的接口,用于定义当特定信号被触发时,进程应如何响应,可将信号的处理方式设置为捕获信号、 忽略信号以及系统默认操作。signum:指定要设置处理方式的信号的编号。handler:sig_t 类型的函数指针,指向信号对应的信号处理函数,当进程接收到信号后会自动执行该处理函数;原创 2024-07-02 15:07:12 · 1069 阅读 · 0 评论 -
嵌入式Linux系统编程 — 6.1 信号的基本概念
信号是一种软件中断机制在Linux系统中,信号是一种软件中断机制,用于通知进程发生了某些事件。信号可以由操作系统内核、用户或另一个进程发送。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程, 其实是在软件层次上对中断机制的一种模拟。信号是异步发生的信号在Linux系统中是异步发生的,这意味着信号的发送和接收是独立于进程的执行流的。当信号发送给进程时,内核会将信号添加到进程的信号队列中,而进程可以在任何时候通过执行信号处理函数来响应这些信号。原创 2024-07-02 11:29:20 · 823 阅读 · 0 评论 -
嵌入式Linux系统编程 — 5.7 Linux系统中proc文件系统
proc文件系统,也称为进程信息文件系统(Process Information file system),是一种在 Linux 和其他类 Unix 系统中存在的虚拟文件系统。它被设计用来提供一种机制,允许用户空间访问内核空间的数据结构和信息。但是与普通文件不同的是, proc 文件系统是动态创建的,文件本身并不存在于磁盘当中、 只存在于内存当中,与 devfs 一样,都被称为虚拟文件系统。原创 2024-07-01 16:45:48 · 1129 阅读 · 0 评论 -
嵌入式Linux系统编程 — 5.6 Linux系统申请堆内存
堆内存(Heap Memory)是计算机程序中用于动态内存分配的内存区域。与栈内存(Stack Memory)不同,堆内存的分配和释放不是自动的,而是由程序员通过调用内存分配函数(如C语言中的malloc和free)来控制的。alloc与malloc类似,但有一些关键的区别。calloc用于分配足够存储一个指定数量的对象的内存块,并且将分配的内存初始化为0。这种分配对于需要从零开始的数组或数据结构非常有用。callocnum:要分配的对象的数量。size:每个对象的大小(以字节为单位)。原创 2024-07-01 15:58:59 · 867 阅读 · 0 评论 -
嵌入式Linux系统编程 — 5.5 sleep、usleep和nanosleep系统休眠函数
在高负载或密集计算任务中,程序可能需要定期休眠,以避免长时间占用CPU,给系统其他部分留出处理时间。:在遇到错误或异常时,程序可能会选择休眠一段时间,然后重试操作,这可以作为简单的错误恢复机制。有时需要将进程暂停或休眠一段时间, 进入休眠状态之后,程序将暂停运行,直到休眠结束。:在某些嵌入式系统或移动设备上,休眠可以用于节能,通过减少CPU的活动来降低功耗。:在需要执行定时任务的场景中,休眠可以用于实现简单的时间调度。usleep函数使调用进程休眠指定的微秒数。sleep函数使调用进程休眠指定的秒数。原创 2024-07-01 11:29:28 · 955 阅读 · 0 评论 -
嵌入式Linux系统编程 — 5.4 rand、srand 函数产生随机数
函数存在一个问题,就是每一次运行程序所得到的随机数序列都是相同的,那如何使得每一次启动应用程序所得到的随机数序列是不一样的呢?那就通过设置不同的随机数种子,可通过 srand()设置随机数种子。则是由算法生成的数值序列,它们看起来随机,但实际上是从一个确定的种子开始,通过数学公式计算得出。使用 srand()函数为 rand()设置随机数种子,这个种子值是随机数生成算法的初始值,它决定了随后。是通过不可预测的物理过程产生的数值,它们具有真正的不确定性,使得每个数值在生成前都无法确定。函数生成的随机数序列。原创 2024-07-01 10:58:53 · 550 阅读 · 0 评论 -
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
times函数是用来获取进程占用CPU的时间信息的,函数返回自进程启动以来,在用户模式和内核模式下消耗的CPU时间。times函数的原型定义在头文件中,其定义如下:buf:times()会将当前进程时间信息存在一个 struct tms 结构体数据中,其定义如下:// 用户模式下的CPU时间// 内核模式下的CPU时间// 子进程在用户模式下的CPU时间// 子进程在内核模式下的CPU时间。原创 2024-06-30 20:18:14 · 919 阅读 · 0 评论 -
嵌入式Linux系统编程 — 5.2 Linux系统时间与日期
通过 time()或 gettimeofday()函数可以获取到当前时间点相对于 1970-01-01 00:00:00 +0000(UTC)这个时间点所经过时间(日历时间) ,所以获取得到的是一个时间段的长度,但是这并不利于我们查看当前时间,下面介绍一些系统调用或 C 库函数,通过这些 API 可以将 time()或gettimeofday()函数获取到的秒数转换为利于查看和理解的形式。由于jiffies与实际时间的秒数不是固定比例,它主要用于内核内部的时间管理,而不是用来获取精确的日期和时间。原创 2024-06-29 17:18:22 · 682 阅读 · 0 评论 -
嵌入式Linux系统编程 — 5.1 uname、sysinfo、gethostname、sysconf函数查询系统信息
函数是 Linux 系统中的系统调用,提供了一种获取系统信息的方法,比如总内存、空闲内存、缓冲区内存、交换内存等。函数在 Linux 系统中是一个系统调用,它用于获取当前操作系统的名称和其他相关信息,通常用于编程中。结构中,并将这个结构的指针作为参数返回。结构中,并将这个结构的指针作为参数返回。函数也是系统调用,用于查询系统相关的配置参数,如内存页面大小、最大文件大小等。是广泛使用的系统调用,它用于获取当前主机的网络名称,也就是主机名。下面的示例程序显示了系统的运行时间、系统负载、内存使用情况等信息。原创 2024-06-29 12:07:16 · 804 阅读 · 0 评论 -
嵌入式Linux系统编程 — 4.7 regcomp、regexec、regfree正则表达式函数
正则表达式又称为规则表达式(Regular Expression),正则表达式通常被用来检索、替换那些符合某个模式(规则)的字符串,正则表达式描述了一种字符串的匹配模式(pattern),可以用来检查一个给定的字符串中是否含有某种子字符串、将匹配的字符串替换或者从某个字符串中取出符合某个条件的子字符串。在 Linux 系统下运行命令的时候,使用过?或*通配符来查找硬盘上的文件或者文本中的某个字符串,?通配符匹配 0 个或 1 个字符,而*通配符匹配 0 个或多个字符,譬如"data?原创 2024-06-28 17:39:20 · 1112 阅读 · 0 评论 -
嵌入式Linux系统编程 — 4.6 atoi、strtol等函数实现字符串与数字转换
atof()strtod()strtof()和strtold()是C语言标准库中用于将字符串转换为浮点数的函数。atof() 函数:将字符串转换为双精度浮点数 (doublestrtod() 函数:将字符串转换为双精度浮点数 (double),可以获取剩余字符串。strtof() 函数:将字符串转换为单精度浮点数 (float),可以获取剩余字符串。strtold() 函数:将字符串转换为长双精度浮点数 (),可以获取剩余字符串。str:指向待转换的以字符串形式表示的浮点数的字符数组。原创 2024-06-28 16:40:10 · 650 阅读 · 0 评论 -
嵌入式Linux系统编程 — 4.5 strcmp、strchr 等函数实现字符串比较与查找
C 语言函数库中也提供了一些用于字符串查找的函数,包括 strchr()、strrchr()、 strstr()、 strpbrk()、 index()以及 rindex()等。strcmp 进行字符串比较,主要是通过比较字符串中的字符对应的 ASCII 码值, strcmp 会根据 ASCII 编码依次比较 str1 和 str2 的每一个字符,直到出现了不同的字符,或者某一字符串已经到达末尾(遇见了字符串结束字符' \0 ')。strstr() 函数在字符串中查找第一次出现子字符串的位置。原创 2024-06-28 12:27:30 · 935 阅读 · 0 评论 -
嵌入式Linux系统编程 — 4.4 memset、bzero函数内存填充
在编程中,经常需要将某一块内存中的数据全部设置为指定的值,譬如在定义数组、结构体这种类型变量时,通常需要对其进行初始化操作,而初始化操作一般都是将其占用的内存空间全部填充为 0。原创 2024-06-28 11:32:53 · 393 阅读 · 0 评论 -
嵌入式Linux系统编程 — 4.3 strcat、strcpy函数拼接与复制字符串
仅将第二个字符串的前两个字符追加到第二个结果缓冲区。函数是C语言标准库中的一个函数,用于将一个字符串追加到另一个字符串的末尾。函数将一个字符串的一部分复制到另一个字符串中,可以指定复制的最大字符数。程序首先定义了两个字符串缓冲区,用于存储用户输入的两个字符串,并通过。函数用于将一个字符串的一部分追加到另一个字符串的末尾,与。,如果目标字符串的空间不足,会导致缓冲区溢出。,并打印出复制的字符串的前20个字符。函数将第一个字符串复制到两个结果缓冲区,接着使用。函数将一个字符串复制到另一个字符串中。原创 2024-06-28 10:23:00 · 700 阅读 · 0 评论 -
嵌入式Linux系统编程 — 4.2 sizeof 和 strlen 的作用和区别
运算符是 C 语言中的一个关键字,用于确定变量或数据类型在内存中的大小(以字节为单位)。它是一个编译时运算符,这意味着它在编译代码时计算大小,而不是在程序运行时。函数是 C 语言标准库中的一个函数,用于计算字符串的长度。,大小为 101,确保有足够的空间存储用户的输入和字符串结束的空字符。最后,程序输出字符串的长度。函数计算字符串的长度。,这是一个无符号整数类型,通常用于表示大小。),这是字符串结束的标准表示方法。函数读取用户输入的一行文本,包括空格。),程序会将其替换为字符串结束的空字符(原创 2024-06-27 23:43:39 · 774 阅读 · 0 评论 -
嵌入式Linux系统编程 — 4.1 字符串输入输出
常用的字符串输出函数有 printf()、putchar()、 puts()、 fputc()、 fputs()。我们经常使用 printf()函数来输出字符串信息,而并没有使用到 putchar()、 puts()、 fputc()、 fputs()这些函数,原因在于printf()可以按照自己规定的格式输出字符串信息,一般称为格式化输出;而 putchar()、 puts()、 fputc()、 fputs()这些函数只能输出字符串,不能进行格式转换。原创 2024-06-27 20:53:08 · 602 阅读 · 0 评论 -
嵌入式Linux系统编程 — 3.7 文件目录与处理
在Linux系统中,文件目录(也常称为文件夹)是一种特殊的文件,它用于组织和管理文件系统中的文件和子目录。目录本身也被视为文件,但是它们具有一些特殊的属性和操作方式,不同于普通文件。在 Linux 系统下,会有一些专门的系统调用或 C 库函数用于对文件夹进行操作,譬如:打开、创建文件夹、删除文件夹、读取文件夹以及遍历文件夹中的文件等。原创 2024-06-27 00:10:41 · 901 阅读 · 0 评论 -
嵌入式Linux系统编程 — 3.6 软连接与硬连接详解
oldpath:指向一个以null结尾的字符串,表示源文件的路径。newpath:指向一个以null结尾的字符串,表示新硬链接的路径。readlink()函数在Linux系统中用于读取软链接指向的目标路径。它允许你获取软链接指向的文件或目录的实际路径。readlink()path:需要读取的软链接文件路径。只能是软链接文件路径,不能是其它类型文件,否则调用函数将报错。buf:用于存放路径信息的缓冲区。bufsiz:读取大小,一般读取的大小需要大于链接文件数据块中存储的文件路径信息字节大小。原创 2024-06-10 20:29:20 · 751 阅读 · 0 评论 -
嵌入式Linux系统编程 — 3.5 utime、utimes、futimens、utimensat函数修改文件时间属性
在Linux系统中,文件的时间属性通常与文件的状态信息一起存储在文件的inode中。在头文件中,结构体用于存储文件的状态信息,包括时间属性。以下是st_atime文件的最后访问时间(Access Time),访问指的是读取文件内容,文件内容最后一次被读取的时间。st_mtime表示文件的最后修改时间(Modification Time),文件内容发生改变,譬如使用 write()函数写入数据到文件中。st_ctime。原创 2024-06-10 12:12:30 · 1132 阅读 · 0 评论 -
嵌入式Linux系统编程 — 3.4 access、chmod和 umask函数修改文件访问权限
文件的权限检查不仅讨论文件本身的权限,还需要涉及到文件所在目录的权限, 只有同时都满足了,才能通过操作系统的权限检查,进而才可以对文件进行相关操作;所以,程序当中对文件进行相关操作之前,需要先检查执行进程的用户是否对该文件拥有相应的权限。需要进行权限检查的文件路径。F_OK:检查文件是否存在R_OK:检查是否拥有读权限W_OK:检查是否拥有写权限X_OK:检查是否拥有执行权限检查项通过则返回 0,表示拥有相应的权限并且文件存在;原创 2024-06-09 11:17:43 · 1064 阅读 · 0 评论 -
嵌入式Linux系统编程 — 3.3 chown、fchown 和 lchown 函数更改文件属主
fchown用于改变一个打开文件描述符的所有权。这个函数允许你更改文件的用户 ID (owner) 和组 ID (group),而不需要知道文件的路径名。fchownfd: 要改变所有权的文件的文件描述符。owner: 新的所有者的用户 ID (UID)。group: 新的组的组 ID (GID)。原创 2024-06-08 20:20:37 · 718 阅读 · 0 评论 -
嵌入式Linux系统编程 — 3.2 stat、fstat 和 lstat 函数查看文件属性
用于指定一个需要查看属性的文件路径。struct stat 类型指针,用于指向一个 struct stat 结构体变量。调用 stat 函数的时候需要传入一个 structstat 变量的指针, 获取到的文件属性信息就记录在 struct stat 结构体中,结构体含义见2.2节。成功返回 0;失败返回-1,并设置 error。原创 2024-06-08 17:20:05 · 1012 阅读 · 0 评论 -
嵌入式Linux系统编程 — 3.1 Linux系统中的文件类型
Linux 下一切皆文件,它们不仅仅是文本或二进制文件。本节将深入探讨Linux系统中的文件类型。虽然我们之前主要讨论了普通文件的I/O操作,但Linux的文件系统远不止于此。与Windows系统不同,Linux不通过文件扩展名来识别文件类型。Windows系统通过文件后缀如.h.c.txt.zip等来识别并调用相应的程序打开文件。例如,.c文件会用代码编辑器打开,而.zip文件则用解压软件处理。Linux则采取了不同的方法。原创 2024-06-08 10:58:31 · 961 阅读 · 0 评论 -
嵌入式Linux系统编程 — 2.4 标准I/O库:I/O缓冲详解
出于速度和效率的考虑,系统 I/O 调用(即文件 I/O)和标准 C 语言库 I/O 函数(即标准 I/O 函数)在操作磁盘文件时会对数据进行缓冲。I/O缓冲指的是在数据传输过程中,用于临时存储数据的内存区域。它允许程序先将数据写入或从内存中的一个缓冲区读取,然后再与外部设备(如硬盘、网络或控制台)进行数据交换。就是强制将文件 I/O 内核缓冲区中缓存的数据写入(刷新)到磁盘设备中。原创 2024-06-07 20:34:54 · 838 阅读 · 0 评论 -
嵌入式Linux系统编程 — 2.3 标准I/O库:格式化I/O
在先前示例代码中,经常使用库函数printf()来输出程序中的打印信息,printf()函数能够将格式化的数据输出到标准输出设备,因此它通常被称为格式化输出函数。除了printf(),还提供了其他几种格式化输出函数,包括fprintf()dprintf()sprintf()和snprintf()。与格式化输出相对应的是格式化输入,它允许从标准输入中获取格式化数据。格式化输入函数包括scanf()fscanf()和sscanf()。将格式化的数据输出到标准输出(通常是终端或控制台)。原创 2024-06-07 12:03:48 · 1294 阅读 · 0 评论 -
嵌入式Linux系统编程 — 2.2 标准I/O库:检查或复位状态
调用fread()函数读取数据时,如果返回值小于参数nmemb所指定的值,这通常意味着发生了两种情况之一:要么是读取过程中遇到了文件末尾(end-of-file,EOF),要么是发生了某种错误。然而,fread()函数本身并不提供足够的信息来区分这两种情况。一种方法是检查错误标志,这可以通过调用ferror()函数实现,它会返回一个非零值如果文件流遇到了错误。另一种方法是检查文件结束标志,这可以通过调用feof()函数来完成,它会在到达文件末尾时返回一个非零值。通过结合使用ferror()和。原创 2024-06-06 20:46:53 · 637 阅读 · 0 评论 -
嵌入式Linux系统编程 — 2.1 标准I/O库简介
Linux系统中的标准I/O库是C语言标准库的一个关键组成部分,它提供了一套丰富的函数接口,用于执行文件的输入输出操作。这些函数定义在<stdio.h>头文件中,包括打开和关闭文件、读取和写入数据、格式化输入输出等。由于标准I/O是C语言标准的一部分,因此使用标准I/O库编写的程序具有良好的可移植性。(1) 打开文件filename:要打开的文件的名称。mode:打开文件的模式,如"r"(只读),"w"(只写,会覆盖文件),"a"(追加),"r+"(读写)等。(2) 关闭文件stream。原创 2024-06-06 11:29:01 · 949 阅读 · 0 评论 -
嵌入式Linux系统编程 — 1.5 文件描述符详解
文件描述符(File Descriptor)是Linux和UNIX系统编程中的一个重要概念,它是一个用于标识打开文件或其他输入/输出资源的非负整数,文件描述符允许程序通过一个抽象的数字来引用文件和其他输入输出资源,而不是直接使用文件名或设备名。从上面的示例代码中可以看到,调用 open 函数会有一个返回值, 譬如示例代码中的 fd1 和 fd2, 这是一个 int 类型的数据,在 open函数执行成功的情况下, 会返回一个非负整数, 该返回值就是一个文件描述符(file descriptor)。原创 2024-06-05 10:56:59 · 865 阅读 · 0 评论 -
嵌入式Linux系统编程 — 1.4 原子操作与竞争冒险
接着进程 A 时间片耗尽、进程 B 运行,同样进程 B 调用 open("./file",O_RDWR)尝试打开文件,结果也失败,接着进程 B 再次调用 open("./file", O_RDWR | O_CREAT, ...)创建此 文件,这一次 open 执行成功,文件创建成功;如果指定的文件不存在,则创建这个文件,这里就提供了一种机制,保证进程是打开文件的创建者,将“判断文件是否存在、创建文件”这两个步骤合成为一个原子操作。确保了写入操作的顺序性,但它并不保证数据的完整性或写入操作的原子性。原创 2024-06-04 19:47:49 · 701 阅读 · 0 评论 -
嵌入式Linux系统编程 — 1.3 空洞文件与文件共享
在 Linux 系统中, open 返回得到的文件描述符 fd 可以进行复制, 复制成功之后可以得到一个新的文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限。这种情况非常简单,多次调用 open 函数打开同一个文件会得到多个不同的文件描述符,并且多个文件描述符对应多个不同的文件表,所有的文件表都索引到了同一个 inode 节点,也就是磁盘上的同一个文件。函数时,如果成功,都会返回一个新的文件描述符,即使打开的是同一个文件。原创 2024-06-03 20:34:46 · 768 阅读 · 1 评论 -
嵌入式Linux系统编程 — 1.2 文件管理与错误处理
在Linux中,错误处理通常通过返回一个错误代码来实现,而更具体的错误信息则存储在全局变量errno中。errno是一个宏,它在头文件<errno.h>中定义。当系统调用或库函数失败时,它们会设置errno为特定的错误代码。调用系统函数:执行如打开文件、读取数据等操作。检查返回值:如果函数返回-1或其他错误指示值,表示函数执行失败。检查errno:调用perror()strerror()或函数来获取errno对应的错误描述。错误处理。原创 2024-06-03 10:57:49 · 1085 阅读 · 1 评论