当前位置: 首页 > article >正文

4.用户 组

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.kler.cn/a/525572.html

相关文章:

  • NLP深度学习 DAY5:Seq2Seq 模型详解
  • .Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇
  • Node.js 的底层原理
  • JavaScript函数中this的指向
  • 【微服务与分布式实践】探索 Sentinel
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.21 索引宗师:布尔索引的七重境界
  • 代码随想录|动态规划 322. 零钱兑换 279.完全平方数 139.单词拆分
  • Java实现LFU缓存策略实战
  • 31. C语言 命令行参数
  • 剑指 Offer II 011. 0 和 1 个数相同的子数组
  • 【开源免费】基于SpringBoot+Vue.JS公交线路查询系统(JAVA毕业设计)
  • unity使用AVpro插件播放视频,打包安卓系统总是失败
  • R语言统计分析——ggplot2绘图4——刻面
  • 21.2-工程中添加FreeRTOS(掌握) 用STM32CubeMX添加FreeRTOS
  • H3CNE-31-BFD
  • WEB集群6-10天
  • 深入解析 C++17 中的 std::not_fn
  • 数据结构--差分数组(含题目)<基础入门>
  • 2025创业思路和方向有哪些?
  • 最新版仿天涯论坛系统源码带后台
  • 30组成字符串ku的最大次数-青训营刷题
  • 将点云转换为 3D 网格:Python 指南
  • 分享几个好用的Edge扩展插件
  • 自制一个入门STM32 四足机器人具体开发顺序
  • Pwn 入门核心工具和命令大全
  • 简要介绍C语言与c++共有的数学函数