【问题标题】:"dup" function, "more" and redirection“dup”功能、“more”和重定向
【发布时间】:2013-02-01 18:20:50
【问题描述】:

我对这个用于教育目的的小代码有疑问。我无法理解它是如何工作的。

#include <stdio.h>
#include <fcntl.h>

#define FNAME "info.txt"
#define STDIN 0
int main(){

   int fd;
   fd = open(FNAME, O_RDONLY);

   close(STDIN); //entry 0 on FDT is now free
   dup(fd); //fd duplicate is now stored at entry 0 
   execlp("more","more",0); 
}

通过启动这个程序,它会在终端上打印文件“info.txt”的内容。我不明白为什么! “更多”和 STDIN(键盘或文件)之间的链接在哪里?

为什么如果我在没有参数且没有重定向文件的情况下使用更多,它只显示一个帮助屏幕,但重定向它使用文件作为输入?

【问题讨论】:

    标签: c unix stdin dup


    【解决方案1】:

    dup 始终为您提供最低的可用文件描述符编号。

    默认情况下,对于stdinstdoutstderr,所有进程都将具有012。您正在打开一个文件,您将获得一个文件描述符值3。之后您关闭了stdin。现在调用dup 之后将给你一个最低的可用值作为3 的重复文件描述符,因此你将获得stdin 作为3 的重复文件描述符。

    int main()
    {
       int fd, fd2;
       fd = open(FNAME, O_RDONLY); //This will be 3
    
       fd2 = dup(fd); //This will be 4 because 4 is the lowest available value
       close(STDIN); //entry 0 on FDT is now free
       dup(fd); //fd duplicate is now stored at entry 0 
       execlp("more","more",0); 
    }
    

    这里为什么要显示文件的内容,more 命令有两种使用方式。

    • 更多文件名
    • 命令 |更多

    在您的执行程序中,您没有将任何filename 作为more 命令的命令行参数。所以它在pipe 模式下执行,通过从标准输入读取它。

    【讨论】:

    • 我知道。我不明白为什么more 使用 STDIN 作为输入而不是只显示帮助屏幕
    • 它检查输入是否是终端,如果是则显示帮助屏幕。否则它会读取标准输入,以允许 some commands | more 使用相当普遍。
    • “more”命令检查输入是否为终端,如果是,则显示“抱歉,您没有给我任何输入”。如果它不是一个终端[例如在这种情况下,一个文件],那么它会继续打印内容。
    • 好的。和more info.txt | more一样,谢谢拉贾!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多