我正在学习系统调用,因此编写了一个代码来使用C语言实现ls.代码有效,但我无法理解它的工作原理
val=(mystat.st_mode & ~S_IFMT)
在下面给出的代码中?我理解其余的代码.
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char* argv[])
{
DIR *mydir;
struct dirent *myfile;
struct stat mystat;
mydir = opendir(argv[1]);
char buf[512];
while((myfile = readdir(mydir)) != NULL)
{
struct tm *time_stamp=localtime(&mystat.st_mtime);
sprintf(buf, "%s/%s", argv[1], myfile->d_name);
stat(buf, &mystat);
//stat(myfile->d_name, &mystat);
mode_t val;
val=(mystat.st_mode & ~S_IFMT);
(val & S_IRUSR) ? printf("r") : printf("-");
(val & S_IWUSR) ? printf("w") : printf("-");
(val & S_IXUSR) ? printf("x") : printf("-");
(val & S_IRGRP) ? printf("r") : printf("-");
(val & S_IWGRP) ? printf("w") : printf("-");
(val & S_IXGRP) ? printf("x") : printf("-");
(val & S_IROTH) ? printf("r") : printf("-");
(val & S_IWOTH) ? printf("w") : printf("-");
(val & S_IXOTH) ? printf("x") : printf("-");
printf("\t%d",mystat.st_nlink);
printf("\t%d",mystat.st_uid);
printf("\t%d",mystat.st_gid);
printf("\t%d",mystat.st_size);
char buffer[80];
strftime(buffer,10,"%b",time_stamp);
printf("\t%4d %s %2d ", time_stamp->tm_year+1900,buffer,time_stamp->tm_mday);
printf(" %s\n", myfile->d_name);
}
closedir(mydir);
}
解决方法:
S_IFMT是文件类型的位掩码(参见man stat)
直接与mystat.st_mode(mystat.st_mode& S_IFMT)进行逐位AND运算意味着只考虑所涉及的位来确定文件类型(常规文件,套接字,块或字符设备等)
使用按位否定位掩码(mystat.st_mode& ~S_IFMT)执行mystat.st_mode的按位AND意味着忽略上面解释的位,只保留需要确定文件权限的位(该命令下面的9行).
标签:c-3,linux,operating-system,system-calls
来源: https://codeday.me/bug/20190623/1273281.html