嵌入式开发基础学习笔记
核心模块:用户/组管理、文件操作、错误处理、开发工具、终端交互。关键点:通过系统调用与标准库结合实现功能,注重错误处理与资源释放。应用场景:系统级程序开发、脚本编写、终端界面美化。
一、Linux系统编程核心接口
-
用户信息操作
-
getpwuid(uid_t uid)-
功能:通过用户ID(UID)查询
/etc/passwd文件,获取用户信息 -
参数:
uid- 用户ID -
返回值:成功返回
struct passwd指针,失败返回NULL
-
-
getpwnam(const char *name)-
功能:通过用户名查询用户信息
-
参数:
name- 用户名 -
返回值:同上
-
-
-
组信息操作
-
getgrgid(gid_t gid)-
功能:通过组ID(GID)查询
/etc/group文件,获取组信息 -
参数:
gid- 组ID -
返回值:成功返回
struct group指针,失败返回NULL
-
-
getgrnam(const char *name)-
功能:通过组名查询组信息
-
参数:
name- 组名 -
返回值:同上
-
-
-
结构体定义
-
struct passwdstruct passwd { char *pw_name; // 用户名 char *pw_passwd; // 密码(通常为加密值) uid_t pw_uid; // 用户ID gid_t pw_gid; // 主组ID char *pw_gecos; // 用户全称 char *pw_dir; // 家目录 char *pw_shell; // 默认Shell }; -
struct groupstruct group { char *gr_name; // 组名 char *gr_passwd; // 组密码 gid_t gr_gid; // 组ID char **gr_mem; // 组成员列表(以NULL结尾) };
-
-
文件链接操作
-
symlink(const char *oldpath, const char *newpath)-
创建软链接(符号链接),
oldpath指向目标文件,newpath为新链接名。
-
-
link(const char *oldpath, const char *newpath)-
创建硬链接,共享同一inode。
-
-
unlink(const char *pathname)-
删除文件或链接。
-
-
rename(const char *oldpath, const char *newpath)-
重命名文件或移动文件。
-
-
-
错误处理
-
errno全局变量:记录最近一次系统调用的错误码。 -
perror(const char *s):打印错误描述(含自定义前缀)。 -
strerror(int errnum):根据错误码返回错误描述字符串。 -
error(int status, int errnum, const char *format, ...):输出错误信息并退出程序。
-
二、文件与目录操作
-
标准I/O vs 文件I/O
-
标准I/O(高层接口):基于流(
FILE*),提供缓冲机制(全缓冲、行缓冲、无缓冲)。 -
文件I/O(底层接口):基于文件描述符(
int fd),直接调用系统调用(如open,read,write)。
-
-
关键函数
-
mkdir/rmdir:创建/删除目录。 -
chdir/getcwd:改变/获取当前工作目录。 -
stat/lstat/fstat:获取文件状态信息(权限、大小、时间戳等)。
-
三、开发工具链
-
编译与构建
-
gcc:C编译器,支持预处理、编译、汇编、链接全流程。 -
make/Makefile:自动化构建工具,通过规则定义编译依赖关系。
-
-
调试与分析
-
gdb:GNU调试器,支持断点、单步执行、变量查看等功能。 -
strace:跟踪系统调用和信号。
-
四、终端颜色控制
-
ANSI转义序列
-
格式:
\033[显示方式;前景色;背景色m-
显示方式:
0(默认)、1(高亮)、4(下划线)等。 -
前景色:
30(黑)~37(白)。 -
背景色:
40(黑)~47(白)。
-
-
示例:
printf("\033[1;31;40m 红色文字 \033[0m"); // 高亮红色字,黑色背景 printf("\033[0m"); // 恢复默认样式
-
五、其他关键概念
-
动态库与静态库
-
.so(共享对象):动态链接库,运行时加载。 -
.a(归档文件):静态库,编译时链接。
-
-
进程与文件管理
-
fork()/exec():创建子进程并执行新程序。 -
wait()/waitpid():等待子进程结束。
-
六、示例代码片段
// 获取用户信息
struct passwd *user = getpwnam("zhaosi");
if (user) {
printf("User: %s, UID: %d, Home: %s\n",
user->pw_name, user->pw_uid, user->pw_dir);
}
// 错误处理
FILE *fp = fopen("file.txt", "r");
if (!fp) {
perror("fopen failed"); // 输出: fopen failed: No such file...
exit(EXIT_FAILURE);
}
结构化总结
-
核心模块:用户/组管理、文件操作、错误处理、开发工具、终端交互。
-
关键点:通过系统调用与标准库结合实现功能,注重错误处理与资源释放。
-
应用场景:系统级程序开发、脚本编写、终端界面美化。
更多推荐
所有评论(0)