如何注意到重定向到目录的标准输入

How to notice stdin redirected to directory

如何在程序中注意到 stdin 被重定向到目录?

如果我执行:

$ cat < .

我收到一条来自 cat 的消息,告诉我:cat: -: Is a directory。如何让我的 C 程序注意到标准输入已被重定向到目录?

您可以通过文件描述符上的fileno() and then do fstat获取stdin的文件描述符。

这里有一个简单的演示:

$ cat test.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(void)
{
    struct stat sb;
    if ( fstat(fileno(stdin), &sb) == -1) {
        perror("fstat");
        exit(1);
    }

    switch (sb.st_mode & S_IFMT) {
        case S_IFBLK:  printf("block device\n");            break;
        case S_IFCHR:  printf("character device\n");        break;
        case S_IFDIR:  printf("directory\n");               break;
        case S_IFIFO:  printf("FIFO/pipe\n");               break;
        case S_IFLNK:  printf("symlink\n");                 break;
        case S_IFREG:  printf("regular file\n");            break;
        case S_IFSOCK: printf("socket\n");                  break;
        default:       printf("unknown?\n");                break;
    }
}
$ gcc -Wall -Wextra test.c
$ ./a.out < .
directory

查找 fstat() 系统调用。 有关详细信息,请参阅 "man fstat"。