linux C语言如何得到一个文件的权限并输出

2024-12-13 21:23:39
推荐回答(3个)
回答1:

/*-楼主可以参考一下我写的这段程序---------*/
/*-----用stat函数得到文件信息,并用函数转化为文本输出,就跟ls命令一样-----*/
/*----------注释我写得很详细,望采纳-----------*/
#include /*-----这三个头文件一定要有-*/
#include
#include
#include
#include
#include
void mode_to_letter(int mode,char *str)
{
/*-------这个函数用来把模式值转化为字符串------*/
str[0]='-'; /*------这里的S_*****都是宏定义,用来判断模式属性-*/

if(S_ISDIR(mode)) str[0]='d';/*-文件夹-*/
if(S_ISCHR(mode)) str[0]='c';/*-字符设备-*/
if(S_ISBLK(mode)) str[0]='b';/*-块设备-*/

if(mode & S_IRUSR) str[1]='r';/*--用户的三个属性-*/
else str[1]='-';
if(mode & S_IWUSR) str[2]='w';
else str[2]='-';
if(mode & S_IXUSR) str[3]='x';
else str[3]='-';

if(mode & S_IRGRP) str[4]='r';/*--组的三个属性-*/
else str[4]='-';
if(mode & S_IWGRP) str[5]='w';
else str[5]='-';
if(mode & S_IXGRP) str[6]='x';
else str[6]='-';

if(mode & S_IROTH) str[7]='r';/*-其他人的三个属性-*/
else str[7]='-';
if(mode & S_IWOTH) str[8]='w';
else str[8]='-';
if(mode & S_IXOTH) str[9]='x';
else str[9]='-';

str[10]='\0';
}

int main(int argc,char *argv[])
{
struct stat sb;/*- 定义stat结构--*/
char str[12];
if(argc!=2){
fprintf(stderr,"Usage: %s \n",argv[0]);
exit(EXIT_FAILURE);
}

if(stat(argv[1],&sb)==-1){/*-stat函数,详情请 man 2 stat 查看 -*/
perror("stat");
exit(EXIT_FAILURE);
}

printf("Mode:%lo(octal)\n",(unsigned long)sb.st_mode);
mode_to_letter(sb.st_mode,str);
printf("Mode:%s\n",str);
return 0;
}

回答2:

参考ln -l命令的输出结果,编写了以下程序(即输出结果和ls -l命令的输出结果相似),通过命令行传入要查看的目录,如果没有传入参数,则显出当前目录:

#include
#include
#include
#include
#include
#include
#include
#include
#include

char *getmod(mode_t mode,char *line) /*生成权限描述字符串*/
{
memset(line,0,sizeof(char)*11);

strcat(line,S_ISDIR(mode)?"d":"-");
strcat(line,(mode&S_IRWXU)&S_IRUSR?"r":"-");
strcat(line,(mode&S_IRWXU)&S_IWUSR?"w":"-");
strcat(line,(mode&S_IRWXU)&S_IXUSR?"x":"-");

strcat(line,(mode&S_IRWXG)&S_IRGRP?"r":"-");
strcat(line,(mode&S_IRWXG)&S_IWGRP?"w":"-");
strcat(line,(mode&S_IRWXG)&S_IXGRP?"x":"-");

strcat(line,(mode&S_IRWXO)&S_IROTH?"r":"-");
strcat(line,(mode&S_IRWXO)&S_IWOTH?"w":"-");
strcat(line,(mode&S_IRWXO)&S_IXOTH?"x":"-");

return line;
}
char *directory(char *argv) /*从程序参数取出目录*/
{
int i;
for (i=strlen(argv)-1;i;--i)
if (argv[i]=='/'){
argv[i+1]='\0';
break;
}
return argv;
}

int main(int argc,char *argv[])
{
DIR *dirp;
struct dirent *dirst;
struct stat finfo;
char *path,fname[512],mod[11],ctm[10];
struct passwd *user=NULL;
struct tm *ltm;

if (argc==1) path=directory(argv[0]);
else path=argv[1];

dirp=opendir(path);
if (!dirp)
{
fprintf(stderr,"ERROR\n");
exit(-1);
}

for (dirst=readdir(dirp);dirst;dirst=readdir(dirp))
{
strcpy(fname,path);

lstat(strcat(strcat(fname,"/"),dirst->d_name),&finfo);
user=getpwuid(finfo.st_uid);

printf("%s\t%10s\t",getmod(finfo.st_mode,mod),user->pw_name);
printf("%10d\t%9d\t",finfo.st_ino,finfo.st_size);
ltm=localtime(&finfo.st_mtime);
strftime(ctm,9,"%b",ltm);
printf("%5s",ctm);
strftime(ctm,9,"%d",ltm);
printf("%3s",ctm);
strftime(ctm,9,"%Y",ltm);
printf("%5s\t",ctm);
printf("%s\n",dirst->d_name);
}
closedir(dirp);
return 0;
}

回答3:

int chmod( const char *filename, int pmode )

成功返回0,失败返回-1 pmode和命令chmod的用法一致