文件和目录(3)

本文详细介绍了Linux系统中关于用户信息、组信息、链接文件和出错相关函数的操作。包括根据用户id获取passwd结构体信息,根据gid获取group结构体信息,创建软硬链接,删除文件或目录,改变文件权限,设置umask值等功能。同时,文章还涵盖了出错处理函数的使用,如打印错误信息和退出程序。
摘要由CSDN通过智能技术生成

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;
}//打印错误号及出错的文件名、位置、函数、时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值