linux c s_irusr 在哪个头文件,c – UNIX系统编程中的S_IFMT是什么?

我正在学习系统调用,因此编写了一个代码来使用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)执行myst​​at.st_mode的按位AND意味着忽略上面解释的位,只保留需要确定文件权限的位(该命令下面的9行).

标签:c-3,linux,operating-system,system-calls

来源: https://codeday.me/bug/20190623/1273281.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值