1.教材第五章学习及与chatgpt的对话
https://chat.openai.com/share/c4899523-cfb7-47a9-9c7c-e74688922c65
2.实验楼
(1)库函数API(mkdir函数)
#include <stdio.h>
#include <stdlib.h> // 包含标准库,用于使用exit函数
#include <sys/stat.h> // 包含sys/stat.h头文件,其中包含mkdir函数的声明
int main() {
const char *dirname = "20233808"; // 指定要创建的目录名
// 调用mkdir函数,创建名为"20233808"的目录,权限为0755
if (mkdir(dirname, 0755) == 0) {
printf("Directory created successfully.\n"); // 如果创建成功,打印成功消息
} else {
perror("mkdir"); // 如果创建失败,使用perror函数打印错误消息
exit(1); // 退出程序并返回1作为错误码
}
return 0; // 返回0表示程序正常执行完成
}
1)模式0755表示文件所有者具有读取、写入和执行权限,文件所属组和其他用户具有读取和执行权限,但没有写入权限。
2)调用库函数API中直接使用mkdir(dirname, 0755) == 0语句进行调用。
(2)嵌入汇编(mkdir函数)
#include <stdio.h>
#include <stdlib.h> // 包含标准库,用于使用exit函数
int main() {
const char *dirname = "202338082"; // 指定要创建的目录名
int result; // 用于保存系统调用结果的变量
asm volatile (
"mov $39, %%eax\n" // 设置系统调用号 (39 是 "mkdir" 的系统调用号)
"mov %0, %%ebx\n" // 设置目录名参数 (dirname)
"mov $0755, %%ecx\n" // 设置权限参数 (0755 权限)
"int $0x80\n" // 调用 0x80 中断来触发系统调用
"mov %%eax, %1\n" // 保存返回值 (结果) 到变量result
: "=r" (result) // 输出操作数
: "r" (dirname) // 输入操作数
: "%eax", "%ebx", "%ecx" // 用于寄存器占用的约束
);
if (result == 0) {
printf("Directory created successfully.\n");
} else {
perror("mkdir"); // 如果创建失败,使用perror函数打印错误消息
exit(1); // 退出程序并返回1作为错误码
}
return 0; // 返回0表示程序正常执行完成
}
1)内嵌汇编代码具体步骤为:
- 使用
mov
指令将系统调用号39放入寄存器%eax
。 - 将
dirname
字符串的地址放入寄存器%ebx
,作为mkdir
的目录名参数。 - 将权限模式0755放入寄存器
%ecx
,作为mkdir
的权限参数。 - 使用
int $0x80
触发0x80中断来执行系统调用。 -
通过内联汇编中的约束,将系统调用的返回值(结果)从寄存器
%eax
复制到C变量result
中。
(3)运行结果
成功创建两个目录20233808和202338082.
3.总结
对系统调用工作机制的理解:
库函数调用提供了更高的可移植性、代码清晰度和安全性,而内嵌汇编较为复杂且不常用。总之,系统调用是操作系统提供给用户程序的接口,允许用户程序执行特权操作,而不必了解或干涉底层硬件和内核细节,使用便利。