#include<pwd.h>
时间: 2024-04-25 15:18:50 浏览: 42
`#include <pwd.h>`是C语言中的一个头文件,它提供了一些函数和数据结构,用于获取用户的密码信息。该头文件通常与`<sys/types.h>`和`<unistd.h>`一起使用。
其中,`<sys/types.h>`包含了一些基本的系统数据类型,如`uid_t`和`gid_t`等。`<unistd.h>`包含了一些系统调用函数的声明,如`getuid()`和`getgid()`等。
在`<pwd.h>`头文件中,最常用的函数是`getpwuid()`和`getpwnam()`。`getpwuid()`函数通过用户的UID(用户标识符)来获取用户的密码信息,而`getpwnam()`函数通过用户名来获取用户的密码信息。
以下是`<pwd.h>`头文件中常用的函数和数据结构:
1. `struct passwd`:用于存储用户的密码信息,包括用户名、用户ID、组ID、用户主目录等。
2. `struct passwd *getpwuid(uid_t uid)`:通过用户的UID获取用户的密码信息。
3. `struct passwd *getpwnam(const char *name)`:通过用户名获取用户的密码信息。
需要注意的是,使用这些函数需要在编译时链接对应的库文件,通常是`-lc`选项。
相关问题
为程序添加备注注意对齐#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <pwd.h> #include <grp.h> #include <time.h> void shell_ls_l(char *file,struct stat st) { char limi
/*
* 该函数实现了类似于Linux终端中的ls -l命令的功能,可以显示文件的详细信息。
* 参数file为要显示信息的文件名;
* 参数st为文件的stat结构体,包含了文件的各种信息,如权限、大小、修改时间等。
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
void shell_ls_l(char *file,struct stat st) {
char limit[10]="rwxrwxrwx"; // 文件权限对应的字符
char perms[11]="----------"; // 文件权限字符串
int i=0;
int j=0;
int k=0;
struct passwd *user; // 用户信息结构体
struct group *group; // 用户组信息结构体
// 设置文件权限字符串
for(i=0;i<9;i++) {
if(st.st_mode & (1<<(8-i))) {
perms[i]=limit[i];
}
}
// 根据文件类型设置第一个字符
switch(st.st_mode & S_IFMT) {
case S_IFLNK:
perms[0]='l';
break;
case S_IFDIR:
perms[0]='d';
break;
case S_IFCHR:
perms[0]='c';
break;
case S_IFBLK:
perms[0]='b';
break;
case S_IFIFO:
perms[0]='p';
break;
case S_IFSOCK:
perms[0]='s';
break;
default:
perms[0]='-';
break;
}
printf("%s ",perms); // 输出文件权限
printf("%d ",(int)st.st_nlink); // 输出硬链接数
user=getpwuid(st.st_uid); // 获取文件拥有者信息
group=getgrgid(st.st_gid); // 获取文件拥有者组信息
printf("%s %s ",user->pw_name,group->gr_name); // 输出拥有者和所属组
printf("%8ld ",st.st_size); // 输出文件大小
char *time_str=ctime(&st.st_mtime); // 获取文件最后修改时间
time_str[strlen(time_str)-1]='\0'; // 去掉不需要的换行符
printf("%s ",time_str); // 输出最后修改时间
printf("%s\n",file); // 输出文件名
}
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <pwd.h> #include <grp.h> #include <time.h> void shell_ls_l(char *file,struct stat st) { char limi
ted[11]; // 文件权限 mode_t mode = st.st_mode; limitted[0] = (S_ISDIR(mode)) ? "d" : "-"; limitted[1] = (mode & S_IRUSR) ? "r" : "-"; limitted[2] = (mode & S_IWUSR) ? "w" : "-"; limitted[3] = (mode & S_IXUSR) ? "x" : "-"; limitted[4] = (mode & S_IRGRP) ? "r" : "-"; limitted[5] = (mode & S_IWGRP) ? "w" : "-"; limitted[6] = (mode & S_IXGRP) ? "x" : "-"; limitted[7] = (mode & S_IROTH) ? "r" : "-"; limitted[8] = (mode & S_IWOTH) ? "w" : "-"; limitted[9] = (mode & S_IXOTH) ? "x" : "-"; limitted[10] = '\0'; printf("%s ", limitted); // 链接数、所有者、所在组、文件大小、创建时间、文件名 printf("%ld ", (long)st.st_nlink); printf("%s ", getpwuid(st.st_uid)->pw_name); printf("%s ", getgrgid(st.st_gid)->gr_name); printf("%lld ", (long long)st.st_size); char time_buf[20]; strftime(time_buf, 20, "%b %d %H:%M", localtime(&st.st_ctime)); printf("%s ", time_buf); printf("%s\n", file); } int main(int argc, char *argv[]) { DIR *dir; struct dirent *ptr; struct stat st; char path[256]; if (argc == 1) { getcwd(path, 256); dir = opendir(path); while ((ptr = readdir(dir)) != NULL) { if (ptr->d_name[0] == '.') continue; stat(ptr->d_name, &st); shell_ls_l(ptr->d_name, st); } } else if (argc == 2) { if (strcmp(argv[1], "-l") == 0) { getcwd(path, 256); dir = opendir(path); while ((ptr = readdir(dir)) != NULL) { if (ptr->d_name[0] == '.') continue; stat(ptr->d_name, &st); shell_ls_l(ptr->d_name, st); } } else { dir = opendir(argv[1]); while ((ptr = readdir(dir)) != NULL) { if (ptr->d_name[0] == '.') continue; sprintf(path, "%s/%s", argv[1], ptr->d_name); stat(path, &st); shell_ls_l(ptr->d_name, st); } } } else if (argc == 3) { if (strcmp(argv[1], "-l") == 0) { dir = opendir(argv[2]); while ((ptr = readdir(dir)) != NULL) { if (ptr->d_name[0] == '.') continue; sprintf(path, "%s/%s", argv[2], ptr->d_name); stat(path, &st); shell_ls_l(ptr->d_name, st); } } } return 0; }
这是一个简单的实现Linux命令ls -l的程序,可以列出文件的权限、链接数、所有者、所在组、文件大小、创建时间、文件名等信息。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)