## 一、用户信息提取
### 1. getpwuid函数
**函数原型**:
```c
#include <pwd.h>
struct passwd *getpwuid(uid_t uid);
```
**功能**:根据用户ID从`/etc/passwd`文件中获取用户信息。
**参数**:
- `uid`:用户ID
**返回值**:
- 成功:返回`struct passwd`指针
- 失败:返回NULL
**结构体成员**:
```c
struct passwd {
char *pw_name; // 用户名
char *pw_passwd; // 用户密码(通常为'x')
uid_t pw_uid; // 用户ID
gid_t pw_gid; // 组ID
char *pw_gecos; // 用户全名或注释
char *pw_dir; // 用户主目录
char *pw_shell; // 用户默认Shell
};
```
**示例代码**:
```c
struct passwd *pwd = getpwuid(1000);
if (pwd != NULL) {
printf("User: %s, UID: %d\n", pwd->pw_name, pwd->pw_uid);
}
```
### 2. getpwnam函数
**函数原型**:
```c
struct passwd *getpwnam(const char *name);
```
**功能**:根据用户名获取用户信息。
**参数**:
- `name`:用户名
**返回值**:同上
**示例**:
```c
struct passwd *pwd = getpwnam("root");
```
---
## 二、组信息提取
### 1. getgrgid函数
**函数原型**:
```c
#include <grp.h>
struct group *getgrgid(gid_t gid);
```
**功能**:根据组ID从`/etc/group`获取组信息。
**参数**:
- `gid`:组ID
**结构体成员**:
```c
struct group {
char *gr_name; // 组名
char *gr_passwd;// 组密码(通常为空)
gid_t gr_gid; // 组ID
char **gr_mem; // 组成员列表(以NULL结尾)
};
```
**示例**:
```c
struct group *grp = getgrgid(1000);
if (grp) {
printf("Group: %s, GID: %d\n", grp->gr_name, grp->gr_gid);
}
```
### 2. getgrnam函数
**函数原型**:
```c
struct group *getgrnam(const char *name);
```
**功能**:根据组名获取组信息。
**示例**:
```c
struct group *grp = getgrnam("admin");
```
---
## 三、链接文件操作
### 1. 创建软链接(symlink)
**函数原型**:
```c
#include <unistd.h>
int symlink(const char *target, const char *linkpath);
```
**示例**:
```c
if (symlink("file.txt", "softlink") == -1) {
perror("symlink error");
}
```
### 2. 创建硬链接(link)
**函数原型**:
```c
int link(const char *oldpath, const char *newpath);
```
**示例**:
```c
link("file.txt", "hardlink");
```
### 3. 删除文件(remove)
**函数原型**:
```c
#include <stdio.h>
int remove(const char *pathname);
```
**注意**:删除目录需递归操作。
### 4. 重命名文件(rename)
**函数原型**:
```c
int rename(const char *oldpath, const char *newpath);
```
---
## 四、错误处理
### 1. perror函数
**功能**:打印错误描述。
```c
#include <stdio.h>
void perror(const char *s);
```
### 2. strerror函数
**功能**:将错误码转换为字符串。
```c
#include <string.h>
char *strerror(int errnum);
```
**示例**:
```c
printf("Error: %s\n", strerror(errno));
```
### 3. error函数
**功能**:打印错误并退出。
```c
#include <error.h>
void error(int status, int errnum, const char *format, ...);
```
**示例**:
```c
FILE *fp = fopen("file.txt", "r");
if (!fp) {
error(EXIT_FAILURE, errno, "Failed to open %s", "file.txt");
}
```
---
## 五、字符串分割(strtok)
**函数原型**:
```c
#include <string.h>
char *strtok(char *str, const char *delim);
```
**示例**:
```c
char str[] = "hello,world,test";
char *token = strtok(str, ",");
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, ",");
}
```
---
## 总结
通过合理使用系统提供的函数,可以方便地获取用户/组信息、操作文件链接,并有效处理程序中的错误。结合示例代码和详细的参数说明,开发者能够快速将这些功能集成到自己的应用程序中。
115

被折叠的 条评论
为什么被折叠?



