4.用户 组

news/2025/1/31 12:33:06 标签: 算法, c++, linux, spring, 网络

4.用户 组

      • **1. 用户和组信息获取**
      • **2. 链接文件操作**
      • **3. 错误处理**
      • **4. Makefile 编写**
      • **5. 系统编程基础**
      • **6. 练习与作业**
      • **7. 总结**


1. 用户和组信息获取

  • getpwuid

    • 函数原型:struct passwd *getpwuid(uid_t uid);
    • 功能:根据用户ID从/etc/passwd文件中获取用户信息。
    • 参数:uid:用户ID。
    • 返回值:成功返回用户信息结构体指针,失败返回NULL
  • getpwnam

    • 函数原型:struct passwd *getpwnam(const char *name);
    • 功能:根据用户名从/etc/passwd文件中获取用户信息。
    • 参数:name:用户名。
    • 返回值:成功返回用户信息结构体指针,失败返回NULL
  • struct passwd

    • 包含用户的基本信息,如用户名、用户ID、家目录、Shell等。
    struct 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程序
    };
    
  • getgrgid

    • 函数原型:struct group *getgrgid(gid_t gid);
    • 功能:根据组ID从/etc/group文件中获取组信息。
    • 参数:gid:组ID。
    • 返回值:成功返回组信息结构体指针,失败返回NULL
  • getgrnam

    • 函数原型:struct group *getgrnam(const char *name);
    • 功能:根据组名从/etc/group文件中获取组信息。
    • 参数:name:组名。
    • 返回值:成功返回组信息结构体指针,失败返回NULL
  • struct group

    • 包含组的基本信息,如组名、组ID、组成员等。
    struct group {
        char *gr_name;   // 组名
        char *gr_passwd; // 组密码
        gid_t gr_gid;    // 组ID
        char **gr_mem;   // 组成员列表
    };
    

2. 链接文件操作

  • symlink
    • 函数原型:int symlink(const char *oldpath, const char *newpath);
    • 功能:创建一个指向oldpath的符号链接文件newpath
    • 参数:
      • oldpath:被链接的文件路径。
      • newpath:新符号链接文件路径。
    • 返回值:成功返回0,失败返回-1
  • remove
    • 函数原型:int remove(const char *pathname);
    • 功能:删除一个文件或空目录。
    • 参数:pathname:文件或目录路径。
    • 返回值:成功返回0,失败返回-1
  • rename
    • 函数原型:int rename(const char *oldpath, const char *newpath);
    • 功能:将文件或目录从oldpath重命名为newpath
    • 参数:
      • oldpath:原路径。
      • newpath:新路径。
    • 返回值:成功返回0,失败返回-1
  • link
    • 函数原型:int link(const char *oldpath, const char *newpath);
    • 功能:创建一个指向oldpath的硬链接文件newpath
    • 参数:
      • oldpath:被链接的文件路径。
      • newpath:新硬链接文件路径。
    • 返回值:成功返回0,失败返回-1

3. 错误处理

  • errno
    • errno是一个全局变量,用于存储系统调用的错误码。
    • errno == 0表示没有错误。
  • perror
    • 函数原型:void perror(const char *s);
    • 功能:打印错误信息,格式为s: 错误描述
    • 参数:s:自定义错误信息。
  • strerror
    • 函数原型:char *strerror(int errnum);
    • 功能:根据错误码errnum返回对应的错误描述字符串。
    • 参数:errnum:错误码。
    • 返回值:成功返回错误描述字符串,失败返回NULL
  • error
    • 函数原型:void error(int status, int errnum, const char *format, ...);
    • 功能:打印错误信息并退出程序。
    • 参数:
      • status:程序退出状态(EXIT_SUCCESSEXIT_FAILURE)。
      • errnum:错误码。
      • format:格式化字符串(类似printf)。

4. Makefile 编写

  • Makefile:用于管理工程编译的工具,定义编译规则和依赖关系。
  • 常用语法
    • 目标文件: 依赖文件
      target: dependencies
          command
      
    • 示例:
      main: main.o utils.o
          gcc -o main main.o utils.o
      
      main.o: main.c
          gcc -c main.c
      
      utils.o: utils.c
          gcc -c utils.c
      
      clean:
          rm -f *.o main
      

5. 系统编程基础

  • 标准I/O
    • 文件操作:fopenfclosefgetcfputcfgetsfputsfreadfwrite
    • 文件定位:fseekftellrewind
    • 错误处理:feofferror
  • 文件I/O
    • 文件操作:openclosereadwrite
    • 文件定位:lseek
  • 目录操作
    • opendirreaddirclosedir
  • 文件属性
    • stat:获取文件属性。
    • st_mode:文件类型和权限。
    • st_size:文件大小。
    • st_mtime:文件最后修改时间。
  • 时间处理
    • time:获取当前时间戳。
    • localtime:将时间戳转换为本地时间。
    • ctime:将时间戳转换为字符串格式。

6. 练习与作业

  • 练习1:编写一个程序,使用getpwnamgetgrnam获取用户和组信息,并打印出来。
  • 练习2:使用symlinklink创建软链接和硬链接文件,并测试它们的区别。
  • 作业1:编写一个简单的minishell,支持lscdmkdir等命令。
  • 作业2:编写一个程序,每隔30秒向日志文件写入一条带有时间戳的信息。

7. 总结

通过getpwuidgetpwnamgetgrgidgetgrnam等函数可以获取用户和组信息;通过symlinklinkremoverename等函数可以操作链接文件;通过errnoperrorstrerror等函数可以处理系统调用错误。结合这些功能,可以实现用户管理、文件操作、错误处理等系统编程任务。


http://www.niftyadmin.cn/n/5838665.html

相关文章

「全网最细 + 实战源码案例」设计模式——桥接模式

核心思想 桥接模式(Bridge Pattern)是一种结构型设计模式,将抽象部分与其实现部分分离,使它们可以独立变化。降低代码耦合度,避免类爆炸,提高代码的可扩展性。 结构 1. Implementation(实现类…

AI协助探索AI新构型的自动化创新概念

训练AI自生成输出模块化代码,生成元代码级别的AI功能单元代码,然后再由AI组织为另一个AI,实现AI开发AI的能力;用AI协助探索迭代新构型AI将会出现,并成为一种新的技术路线潮流。 有限结点,无限的连接形式&a…

玩转大语言模型——使用langchain和Ollama本地部署大语言模型

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…

AI DeepSeek-R1 Windos 10 环境搭建

1、安装: 下载 Python |Python.org CUDA Drivers for MAC Archive | NVIDIA pip 和virtualenv Download Ollama on Windows 如下图 2、下载模型 deepseek-r1 ollama run deepseek-r1 或者可以ollama run deepseek-r1:8b 或 3、安装一个可视化对话Chatbox 下载 …

代码随想录算法训练营第三十九天-动态规划-337. 打家劫舍 III

老师讲这是树形dp的入门题目解题思路是以二叉树的遍历(递归三部曲)再结合动规五部曲dp数组如何定义:只需要定义一个二个元素的数组,dp[0]与dp[1] dp[0]表示不偷当前节点的最大价值dp[1]表示偷当前节点后的最大价值这样可以把每个节…

SpringBoot AOP 和 事务

SpringBoot 整合 AOP 动态代理技术 JDK 动态代理 JDK 动态代理是 Java 自带的一种代理方式。它要求目标类必须有接口,基于这个接口,JDK 在运行时会动态生成一个代理对象。这个代理对象和目标对象就像 “拜把子” 的兄弟,因为它们都实现了相同…

arm-linux-gnueabihf安装

Linaro Releases windows下打开wsl2中的ubuntu,资源管理器中输入: \\wsl$gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 复制到/home/ark01/tool 在 Ubuntu 中创建目录: /usr/local/arm,命令如下: …

如何构建树状的思维棱镜认知框架

在思维与知识管理中,“树状思维棱镜”通常指一种层级式、可多维度展开和不断深入(下钻)的认知框架。它不仅仅是普通的树状结构(如传统思维导图),更强调“棱镜”所体现的多视角、多维度切换与综合分析的能力…