当我运行该代码时,它没有任何作用。为什么?
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
int i; struct stat buf;
for (i = 1; i<argc; i++) {
printf("%s:", argv[i]);
if (lstat(argv[i], &buf) <0) {
printf("lstat error");
continue;
}
if (S_ISREG(buf.st_mode)) printf("regular");
else if (S_ISDIR(buf.st_mode)) printf("directory");
else if (S_ISCHR(buf.st_mode)) printf("character special");
else if (S_ISBLK(buf.st_mode)) printf("block special");
}
exit(0);
}
当我运行该代码时,它没有任何作用。为什么?
答案 0 :(得分:1)
我认为您的代码可以正常工作。
什么都不做的原因可能是您不将任何输入参数传递给程序的原因。赶上这种情况并通知用户有关情况。
另一件事-您应将绝对路径或相对路径传递给被检查的文件(除非您将被检查的文件放置在与程序相同的目录中)。
下面是对代码的小修改:
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
int
main(int argc, char **argv) {
int ii;
struct stat buf;
if (argc == 1) {
printf("[%s]: No files to check.\n", argv[0]);
return (1);
}
for (ii = 1; ii < argc; ii++) {
printf("%s: ", argv[ii]);
if (lstat(argv[ii], &buf) < 0) {
printf("lstat() error.\n");
continue;
}
if (S_ISREG(buf.st_mode)) {
printf("Regular.\n");
} else if (S_ISDIR(buf.st_mode)) {
printf("Directory.\n");
} else if (S_ISCHR(buf.st_mode)) {
printf("Character special.\n");
} else if (S_ISBLK(buf.st_mode)) {
printf("Block special.\n");
} else if (S_ISFIFO(buf.st_mode)) {
printf("Pipe or FIFO special file.\n");
} else if (S_ISLNK(buf.st_mode)) {
printf("Symbolic link.\n");
} else if (S_ISSOCK(buf.st_mode)) {
printf("Sccket.\n");
} else if (S_ISWHT(buf.st_mode)) {
printf("Whiteout.\n");
}
}
return (0);
}
程序执行中的示例日志:
# touch file # ./prog /usr/bin/ftp /dev/random random / /dev/stdin file /usr/bin/ftp: Regular. /dev/random: Character special. random: lstat error. /: Directory. /dev/stdin: Symbolic link. file: Regular
除了file
和random
以外,所有传递的参数都是所有类Unix操作系统的标准文件。
如您所见,当我传递random
时没有指向该文件的绝对路径时,出现lstat(2)
错误。但是,当我通过/dev/random
时,我看到了此文件的正确打印类型。原因很简单-lstat(2)
不会尝试在文件系统中查找文件。
关于file
,我在运行编译程序之前就创建了它,并且您可以看到lstat(2)
syscall不会因出现错误而结束,因为在与您相同的目录中找到了文件程序(更详细地说:file
与二进制程序位于同一名称空间中)。