[英]System call in unix: directories and files
您好,我试图了解系统调用:UNIX上的目录和文件,..我在此网站上找到了他们用自己的示例解释一些调用的内容,但不理解这些代码段..
void state (char *file)
{
struct stat buf;
struct passwd *pw;
struct group *gr;
int i;
if (stat(file, &buf)==-1)
{
perror(file);
exit(-1);
}
printf ("file: %s\n", archivo);
printf ("\t resides in the device: %d, %d\n",(buf.st_dev & 0xFF00)>>8, buf.st_dev & 0x00FF);
printf ("\t i-node number: %d\n", buf.st_ino);
printf ("\t type: ");
switch (buf.st_mode & S_IFMT)
{
case S_IFREG: printf ("ordinario\n"); break;
case S_IFDIR: printf ("directorio\n"); break;
case S_IFCHR: printf ("tipo caracter\n"); break;
case S_IFBLK: printf ("tipo bloque\n"); break;
case S_IFIFO: printf ("FIFO\n"); break;
}
if (buf.st_mode & S_ISUID) printf ("\tSUID activo");
if (buf.st_mode & S_ISGID) printf ("\tSGID activo");
if (buf.st_mode & S_ISVTX) printf ("\tStiky bit activo\n");
/* Permissions access */
printf ("\tPermission: 0%o ",buf.st_mode & 0777);
for (i=0; i<9; i++)
if (buf.st_mode & (0400>>i)) printf ("%c", permisos[(8-i)%3]);
else printf ("-"); ....
我不了解比较以找出缺少的设备文件..有人可以帮助我理解吗? 特别是在这里..
printf ("\tReside en el dispositivo: %d, %d\n", (buf.st_dev & 0xFF00)>>8,
buf.st_dev & 0x00FF);
/* Permissions */
printf ("\tPermission: 0%o ",buf.st_mode & 0777);
for (i=0; i<9; i++)
if (buf.st_mode & (0400>>i)) printf ("%c", permisos[(8-i)%3]);
else printf ("-");
将欢迎双方的比较提供任何帮助或解释PD:对不起,我的英语= P
链接,其中出现了名为estado.c的整个代码示例1。
我假设你的意思是:
(buf.st_dev & 0xFF00)>>8
那不是比较。 >>
是右移运算符。 它将第一个操作数向右移动第二个操作数指定的位数。 该表达式将buf.st_dev的第9到第16位之外的所有位清零(这是& 0xFF00
所做的事情),然后将所得的8位向下移位到第1到第8位最低有效位。 这将导致数字从0到255。
(buf.st_dev & 0xFF00)>>8, buf.st_dev & 0x00FF
不是比较,而是算术表达式:
&
对操作数执行按位与运算:
0&0 = 0
0&1 = 0
1&0 = 0
1&1 = 1
>>
执行按位移位
使用&
是从其他值“屏蔽”位的一种常用方法,以便可以单独检查它们。 在第一个表达式中,位置8到15中的8位被隔离并移位到位置0到7中,因此,似乎倒数第二个有效字节显示为独立字节。
第二个表达式不进行移位,因为在屏蔽之后它已经处于最低位,因此直接有意义。
我们试图在此处访问用于stat和lstat之类的命令的stat结构:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
对于该行:
buf.st_mode & (0400>>i)
我认为他们正在尝试提取上述结构的st_mode成员中5-16位文件的权限。
我认为我们也可以使用宏S_IFMT提取信息:
file_type = statbuf.st_mode&S_IFMT; // for bits 1-4
file_perm = statbuf.st_mode&~S_IFMT // for bits 5-16
我想开发人员会在您的代码段中手动执行相同的操作,并显示rwx或--我想。
至于代码的st_dev部分:
我从来没有真正尝试过操纵该成员变量,所以我不能说该成员确实如此。 找出sys/types.h
的最佳方法是查看sys/types.h
定义。 至于用法的原因与Laurence Gonsalves试图解释的原因相同。
我从手册页中看到的是以下行:“一起使用的st_ino和st_dev字段唯一地标识系统中的文件。”
希望此信息对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.