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_SUCCESS
或EXIT_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:
- 文件操作:
fopen
、fclose
、fgetc
、fputc
、fgets
、fputs
、fread
、fwrite
。 - 文件定位:
fseek
、ftell
、rewind
。 - 错误处理:
feof
、ferror
。
- 文件操作:
- 文件I/O:
- 文件操作:
open
、close
、read
、write
。 - 文件定位:
lseek
。
- 文件操作:
- 目录操作:
opendir
、readdir
、closedir
。
- 文件属性:
stat
:获取文件属性。st_mode
:文件类型和权限。st_size
:文件大小。st_mtime
:文件最后修改时间。
- 时间处理:
time
:获取当前时间戳。localtime
:将时间戳转换为本地时间。ctime
:将时间戳转换为字符串格式。
6. 练习与作业
- 练习1:编写一个程序,使用
getpwnam
和getgrnam
获取用户和组信息,并打印出来。 - 练习2:使用
symlink
和link
创建软链接和硬链接文件,并测试它们的区别。 - 作业1:编写一个简单的
minishell
,支持ls
、cd
、mkdir
等命令。 - 作业2:编写一个程序,每隔30秒向日志文件写入一条带有时间戳的信息。
7. 总结
通过getpwuid
、getpwnam
、getgrgid
、getgrnam
等函数可以获取用户和组信息;通过symlink
、link
、remove
、rename
等函数可以操作链接文件;通过errno
、perror
、strerror
等函数可以处理系统调用错误。结合这些功能,可以实现用户管理、文件操作、错误处理等系统编程任务。