Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何注意stdin重定向到目录_C_Stdin_Io Redirection - Fatal编程技术网

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”