1.用户信息
(1)
功能:
根据用户id,到/etc/passwd文件下解析获得的结构体信息
参数:
uid:用户id,通过stat()函数得到
返回值:
成功:返回id对应的用户信息,即指向passwd结构体的指针
失败:返回NULL
(2)
功能:
根据用户id,到/etc/passwd文件下解析获得的结构体信息
参数:
name:指定要找谁的信息
返回值:
成功:返回passwd的结构体指针
失败:返回NULL
2.组信息
(1)
功能:
根据gid到/etc/group文件中解析组信息
参数:
gid:组id,通过stat()函数得到
返回值:
成功:返回group的结构体指针
失败:返回NULL
(2)
功能:
根据gid到/etc/group文件中解析组信息
参数:
name:指定要找谁的信息
返回值:
成功:返回group的结构体指针
失败:返回NULL
练习:
实现ll的功能:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include <time.h>
#include <grp.h>
#include <dirent.h>
int show(char* name)
{
struct stat buf;
int ret = stat(name,&buf);//获取该文件的详细信息
if( -1 == ret)
{
printf("stat error");
return 1;
}
if(S_ISREG(buf.st_mode))//判断是否为普通文件
{
printf("-");
}
else if (S_ISDIR(buf.st_mode))//判断是否为目录
{
printf("d");
}
else
{
printf("u");
}
if(buf.st_mode & S_IRUSR)//判断是否可读
{
printf("r");
}
else
{
printf("-");
}
if(buf.st_mode & S_IWUSR)//判断是否可写
{
printf("w");
}
else
{
printf("-");
}
if(buf.st_mode & S_IXUSR)//判断是否可执行
{
printf("x");
}
else
{
printf("-");
}
//rwx
printf(" %d",buf.st_nlink);//打印该文件的硬链接个数
// printf(" %d",buf.st_uid);//用户id,此时用户名若为root,则显示为0
struct passwd * pw = getpwuid(buf.st_uid);
printf(" %s",pw->pw_name);//用户id,此时更接近ll的显示,用户若为root,则显示为root
// printf(" %d",buf.st_gid);//组id,此时组名若为root,则显示为0
struct group*gr=getgrgid(buf.st_gid);
printf(" %s",gr->gr_name);//组id,此时更接近ll的显示,组名若为root,则显示为root
printf(" %ld",buf.st_size);//打印文件大小,单位为byte
struct tm *dt=localtime(&buf.st_mtime);
printf(" %d月 %d %d:%d",dt->tm_mon+1,dt->tm_mday,
dt->tm_hour,dt->tm_min);//打印时间
// printf(" %ld",buf.st_mtime);//打印时间
printf(" %s\n",name);//打印文件的路径及名
}
int main(int argc, const char *argv[])
{
DIR* dir = opendir("/etc");
if(NULL == dir)
{
printf("opendir error\n");
return 1;
}
struct dirent* info;
while(info = readdir(dir))
{
//1.c
//printf("%s\n",info->d_name);
// /etc/1.c getcwd();
char path[256]={0};
sprintf(path,"/etc/%s",info->d_name);
show(path);
}
closedir(dir);
return 0;
}
3.链接文件
软链接文件、硬链接文件、符号链接文件
(1)
功能:
创建一个链接向oldpath文件的新符号链接文件,该文件与原文件大小不一样
参数:
oldpath:被链接向的文件路径
newpath:新符号链接文件
返回值:
成功:返回0
失败:返回-1
(2)
命令行(创建硬链接):ln oldpath newpath
功能:
创建一个硬链接文件,该文件与原文件的大小等信息都一样
参数:
oldpath:要链接向的文件路径
newpath:创建的新硬链接文件路径
返回值:
成功:返回0
失败:返回-1
eg:
//结果:成功在该目录下创建一个文件./66.txt,大小,用户名,组名,时间等与./6.txt的一样
(3)
命令行(创建软链接):ln -s oldpath softlink
eg:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int ret = symlink("./6.txt","softlink");//在该目录下创建该文件的软链接
if( -1 == ret )
{
printf("symlink error\n");
}
else
{
printf("symlink success\n");
}
return 0;
}
//结果在该目录下显示一个文件名为:softlink-> ./6.txt的文件
(4)
功能:
把该文件删除,而且,若该文件对应的数据块(硬链接文件)的硬链接数即将为0(即为1时),则回收该数据块,若不为0,则让其硬链接数-1
参数:
pathname:要删除的文件路径
返回值:
成功:返回 0
失败:返回-1
eg:
结果:
(5)
功能:
删除一个文件或目录
参数:
pathname:文件或目录的路径
返回值:
成功:返回0
失败:返回-1
eg:
(6)
功能:
改变一个文件的名字或路径
参数:
oldpath:原来的路径名
newpath:新的路径名
返回值:
成功:返回0
失败:返回-1
eg:
(7)
功能:
检验当前用户对该文件有无读、写、执行的权限
参数:
pathname:需测试的文件路径
mode: R_OK, W_OK, and X_OK.
格式:R_OK |W_OK|X_OK
返回值:
成功:返回0,说明具有对应的权限
失败:返回-1,说明不具有
eg:
(8)
功能:
设置掩码umask的值,这个值只和新建文件,新建目录有关
参数:
mask:新的掩码值
返回值:
返回旧的掩码值
(9)
命令行:
chmod +/- w/r/x 增加或减去可写/可读/可执行权限
或:chmod 777 文件名 即使该文件有w、r、x的权限
功能:
设置文件相应的权限,这个权限不会和umask按位与
参数:
path:需被设置权限的文件名
mode:需被指定的权限
返回值:
成功:返回0
失败:返回-1
(10)
功能:
在文件的尾端处截去一些数据以缩短文件,保留指定长度
参数:
path:文件路径
length:截取后文件的长度
返回值:
成功:返回0
失败:返回-1
4.出错相关函数
(1)
功能:
打印s字符串和errno对应的错误信息,但是不会直接退出
参数:
s:要打印在终端上的出错信息
返回值:
缺省,无返回值
eg:
#include <stdio.h>
int main(int argc, const char *argv[])
{
FILE* fp = fopen("/etc/passwd","w");
if(NULL == fp)
{
perror("fopen");
return 1;
}
return 0;
}//显示格式:fopen:出错原因
(2)
功能:
打印errnum出错码对应的所有出错信息,共132项
参数:
errnum:出错errno号
返回值:
成功:返回对应的错误信息
失败:返回-1
eg:
int main(int argc, const char *argv[])
{
int i = 0;
for(i = 0;i < 133;++i)
{
printf("%d %s\n",i,strerror(i));
}
return 0;
}
(3)
功能:
打印对应出错原因和用户输入字符串并退出,可用于快速定位到出错的位置及原因
参数:
status:程序退出的状态
EXIT_FAILURE / 1
EXIT_SUCCESS / 0
errnum:错误码
format:类似printf()的格式
可输出内容__FILE__ 表示是那个文件
__LINE__表示第几行
__func__表示在那个函数
__DATE__表示日期
返回值:
缺省
eg:
#include <stdio.h>
#include <error.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
FILE*fp = fopen("/etc/passwd","w");
if(NULL == fp)
{
error(1,errno,"fopen:file:%s line:%d func:%s,date:%s"
,__FILE__,__LINE__,__func__,__DATE__);
}
return 0;
}//打印错误号及出错的文件名、位置、函数、时间