如何注意到重定向到目录的标准输入
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"。
如何在程序中注意到 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"。