当我运行它时,此代码不执行任何操作。为什么?

时间:2018-11-02 18:03:19

标签: c linux unix operating-system posix

当我运行该代码时,它没有任何作用。为什么?

#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);
}

当我运行该代码时,它没有任何作用。为什么?

1 个答案:

答案 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

除了filerandom以外,所有传递的参数都是所有类Unix操作系统的标准文件。 如您所见,当我传递random时没有指向该文件的绝对路径时,出现lstat(2)错误。但是,当我通过/dev/random时,我看到了此文件的正确打印类型。原因很简单-lstat(2)不会尝试在文件系统中查找文件。

关于file,我在运行编译程序之前就创建了它,并且您可以看到lstat(2) syscall不会因出现错误而结束,因为在与您相同的目录中找到了文件程序(更详细地说:file与二进制程序位于同一名称空间中)。