# Linux系统信息提取与文件操作函数详解

## 一、用户信息提取

### 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, ",");
}
```

---

## 总结

通过合理使用系统提供的函数,可以方便地获取用户/组信息、操作文件链接,并有效处理程序中的错误。结合示例代码和详细的参数说明,开发者能够快速将这些功能集成到自己的应用程序中。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值