Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
freem
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Openai/6911cc4b-5d54-800b-88ae-dc7ac6ff2d3d
(section)
Add languages
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==== 学习内容 ==== ===== 《Head First C 嗨翻 C 语言》第 9 章 ===== ====== 一、 系统调用和内核 (System Calls and Kernel) ====== * '''系统调用 (System Call):''' C程序与操作系统内核沟通的机制 。它是操作系统内核中的函数,C标准库的大部分功能(例如printf())都依赖于它们来与硬件交互 。 * '''内核 (Kernel):''' 计算机中最重要的程序,负责管理三方面: * '''进程 (Processes):''' 加载程序到内存并创建进程,确保它们获得所需资源,并监控进程状态 。 * '''存储器 (Memory):''' 分配和管理每个进程的存储器大小,并可能使用磁盘交换来增加虚拟存储器空间 。 * '''硬件 (Hardware):''' 通过设备驱动与计算机上的设备(如键盘、屏幕)进行交互 。 ====== 二、 system() 函数 ====== * '''功能:''' 接收一个字符串参数,并将其作为命令执行 。 * '''用途:''' 是在代码中运行其他程序的捷径,尤其适用于建立快速原型,可以避免编写大量的C代码 。 * '''缺点/安全问题:''' * system()必须解释命令字符串,这容易出错 。 * 存在'''命令行注入'''的安全风险,用户可以通过在输入文本中注入命令行代码(例如使用&&)来运行任意命令 。 * 其他问题包括注释文本中的引号(撇号)破坏命令引号,以及PATH变量可能导致调用错误的程序 。 ====== 三、 exec() 家族函数 ====== * '''功能:''' 运行其他程序来'''替换'''当前的进程 。新程序启动后会沿用原有进程的PID(进程标识符)。它通过明确指定要运行的程序来消除system()的歧义问题 。 * '''进程 (Process):''' 存储器中运行的程序,由一个数字(进程标识符,PID)来标识 。 * '''函数命名规则:''' exec 后可跟 l 或 v,以及可选的 p 和 e 。 * l ('''L'''ist): 接收参数列表 。 * v ('''V'''ector): 接收参数数组或向量 。 * p ('''P'''ATH): 根据 PATH 环境变量查找程序 。 * e ('''E'''nvironment): 接收环境变量字符串数组 。 * '''参数列表函数示例:''' execl(), execlp(), execle() 。参数列表必须以 NULL 结束 。 * '''参数数组函数示例:''' execv(), execvp(), execve() 。 * '''环境变量 (Environment Variables):''' * 每个进程都有一组环境变量 。 * C程序可以使用 stdlib.h 中的 getenv() 函数读取环境变量 。 * 使用以 e 结尾的 exec() 函数(如 execle())可以传递新的环境变量数组,数组格式为 "变量名=值",并以 NULL 结束 。 ====== 四、 错误处理 (Error Handling) ====== * '''exec() 错误判断:''' 如果 exec() 调用成功,当前程序会停止运行;如果失败,程序会继续运行 exec() 之后的代码 。 * '''失败黄金法则:''' 大多数系统调用失败时会遵循以下原则: * 返回 -1 。 * 将全局变量 errno 设为错误码 。 * '''errno:''' 定义在 errno.h 中的全局变量,用于保存系统调用的错误码 。 * '''strerror():''' 定义在 string.h 中,可以将 errno 错误码转换为可读的标准错误消息 。 ====== 五、 fork() 函数 ====== * '''问题背景:''' 由于 exec() 会替换当前进程,如果在循环中直接调用 exec(),程序只会执行一次 exec() 就会终止 。 * '''功能:''' fork() 系统调用会'''克隆'''当前进程,创建一个新的子进程 。父进程和子进程会从 fork() 调用后的同一行代码开始执行 。 * '''返回值区分:''' * '''子进程 (Child Process):''' fork() 返回 '''0''' 。 * '''父进程 (Parent Process):''' fork() 返回 '''非零值'''(即子进程的PID)。 * '''失败:''' fork() 返回 '''-1''' 。 * '''fork() + exec() 模式:''' 在 '''子进程''' 中调用 exec() 函数来替换自身运行新程序,从而允许 '''父进程''' 继续运行,实现并发或连续操作 。 * '''效率技巧:''' 操作系统使用“写时复制”(copy on-write)技术,父子进程最初共享数据,只有当其中一方尝试修改数据时,系统才会进行复制. * '''平台限制:''' Windows 系统本身不支持 fork(),但在 Cygwin 等环境中可以通过模拟实现 。 我最近学习了这些知识点,请使用苏格拉底方式提问我,一次一个问题
Summary:
Please note that all contributions to freem are considered to be released under the Creative Commons Attribution-ShareAlike 4.0 (see
Freem:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)