C 如何注意stdin重定向到目录
你怎么能在程序中注意到C 如何注意stdin重定向到目录,c,stdin,io-redirection,C,Stdin,Io Redirection,你怎么能在程序中注意到stdin被重定向到一个目录 例如,如果我执行: $ cat < . $cat
stdin
被重定向到一个目录
例如,如果我执行:
$ cat < .
$cat<。
我从
cat
收到一条消息,告诉我:cat:-:是一个目录
。如何使我的C程序注意到stdin已重定向到目录?您可以通过获取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
$cat test.c
#包括
#包括
#包括
#包括
内部主(空)
{
结构统计某人;
if(fstat(fileno(stdin),&sb)=-1){
佩罗尔(“fstat”);
出口(1);
}
开关(sb.st\U模式和S\U IFMT){
案例S_IFBLK:printf(“块设备”);中断;
案例S_IFCHR:printf(“字符设备”);中断;
案例S_IFDIR:printf(“目录”);break;
案例S_IFFO:printf(“FIFO/管道”);中断;
案例S_iFlink:printf(“符号链接”);中断;
案例S_IFREG:printf(“常规文件”);中断;
案例S_IFSOCK:printf(“套接字”);中断;
默认值:printf(“未知?\n”);中断;
}
}
$gcc-Wall-Wextra测试.c
美元/年<。
目录
查找fstat()系统调用。
有关详细信息,请参阅“man fstat”