首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么要使用链接到标准输入的文件描述符,而不是直接使用标准输入?

使用链接到标准输入的文件描述符而不是直接使用标准输入有以下几个原因:

  1. 灵活性:通过使用文件描述符,可以将标准输入重定向到其他文件或者管道。这样可以实现输入的灵活控制,例如从文件中读取输入或者从其他程序的输出中读取输入。
  2. 可编程性:使用文件描述符可以在程序中以编程方式控制输入。可以通过文件描述符进行读取、写入、定位等操作,从而实现更复杂的输入处理逻辑。
  3. 多路复用:文件描述符可以与其他文件描述符一起使用,实现多路复用的功能。通过将标准输入与其他文件描述符一起使用,可以同时处理多个输入源,提高程序的效率和灵活性。
  4. 代码复用:使用文件描述符可以使代码更具有可重用性。通过将标准输入的文件描述符传递给其他函数或模块,可以在不同的上下文中共享输入处理逻辑,避免重复编写相同的代码。

总结起来,使用链接到标准输入的文件描述符而不是直接使用标准输入可以提供更大的灵活性、可编程性、多路复用能力和代码复用性。这样可以更好地控制输入,并使程序更加灵活和可扩展。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

06-1重定向

1.标准输出重定向 I/O 重定向功能可以重新定义标准输出内容发送目的地。 使用重定向操作符“ > ”,后面接文件名,就可以把标准输出重定向到另一个文件中,不是显示在屏幕上。...ls -l /bin/usr > ls-output.txt 我们会收到一条错误信息,因为我们指定是一个不存在目录,所以这个错误信息是正确,但是为什么这个错误信息显示在屏幕上,不是重定向到 ls-output-noexist.txt...2.标准错误重定向 标准错误重定向并不能简单地使用一个专用重定向符来实现。实现标准错误重定向,不得不提到它文件描述符。...shell 提供了使用文件描述符编号来重定向文件表示法。由于标准错误等同于文件描述符 2,所以可以使用这种表示法来重定向标准错误。...此时使用了重定向符 ” < “, 所以标准输入源更改为 wsq.txt 文件。 ? 重定向标准输入.png 使用重定向符 ” < “,我们将把标准输入源从键盘变为 wsq.txt 文件

83420

Linux系列之重定向操作

前言 I/O重定向允许我们将命令输入和输出重定向到文件中,以及将多个命令连接到一起成为管道。本文就来介绍有关重定向知识。 标准输入、输出、错误 输出包括两种类型: 程序结果。...默认情况下,stdout和stderr 都被链接到屏幕上,不是保存到文件中。重定向允许我们改变输出去向和输入来源。...重定向标准输出 为了重定向到其他文件不是屏幕上,我们使用>重定向操作符,后面跟随文件名称。...举例来说,我们可以使用重定向操作符来告诉shell,发送ls命令输出到ls-output.txt文件中,不是屏幕上。...需要注意是,使用>重定向操作符会覆盖目标文件。如果追加内容,我们可以使用>>重定向操作符。 重定向标准错误 为了重定向stderr,我们必须引用其文件描述符

1.1K20

六.Linux管道及重定向

把管道作为标准输入输出 管道创建成功后,就可以直接使用 read()和 write()函数对管道进行数据读写。...因为shell中都是使用标准输入输出对管道进行读写,例如ls | grep main.c就是将 ls 标准输出写到了管道写端, grep 标准输入则从管道读端读取,所以本文也只描述此方法。...文件描述符,本质是非负整数,通常是小整数;它是一个索引,通过该索引可以找到对应文件。例如,标准输入标准输出、标准错误文件描述符默认是 0、1、2 。...调用dup2(fd[0],0),实际上就是将文件描述符 3 指向文件表项赋值给了文件描述符 0,文件描述符 0 正是进程默认标准输入。...文件重定向 文件重定向其实与上面管道重定向到标准输入输出很类似,甚至可以直接采用上面所说方法来实现。但是此处将讲述一种更加简洁方法实现。

2.3K20

Linux入侵 反弹shell

要想了解“>&”和“0>&1”,首先我们先了解一下Linux文件描述符和重定向。 linux shell下常用文件描述符是: 1....标准输入 (stdin) :代码为 0 ,使用 或 >>3....我们都知道,标准输入应该是“0”,难道这个跟上一个问题样都是同一个命令不同写法?让我们试一下“0<&1”,看看会发生什么。 在上图中我们得到了一个交互shell。果然是这样!...首先引入了三个库socket,subprocess,os,这三个库后面都要用到,然后创建了一个使用TCPsocket,接着执行connect函数连接到黑客主机所监听端口。...dup2传入两个文件描述符,fd1和fd2(fd1是必须存在),如果fd2存在,就关闭fd2,然后将fd1代表那个文件强行复制给fd2,fd2这个文件描述符不会发生变化,但是fd2指向文件就变成了

6.1K30

php各种 IO流 以及用法

; 可看到,上面使用了php://stdin 协议,打开了一个标准输入操作句柄,然后可读取用户在控制台输入数据 上面的代码也可写成: <?...php://stdin,也是关闭复制,STDIN已打开不会被关闭 2:php://stdin是只读 3:请直接使用STDIN常量,使用php://stdin 4:使用fgets读取,只能读取一行数据...用法: 在linux中,一切皆文件,当启动系统时,先会启动STDIN标准输入(文件描述符0),之后是STDOUT文件描述符1,STDERR文件描述符2 使用php://fd,可直接调用该文件: <?...名称 描述 resource= 这个参数是必须。它指定了你筛选过滤数据流。 read= 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。...该协议个人不是很会用,并且个人觉得没啥必要学习,所以直接复制php手册例子吧 <?

1.3K21

干货 | Linux信息收集、渗透测试常用命令

(-type f: 一般文件类型) find / -perm -g=s -type f # SUID(chmod 4000) - 作为属主运行文件不是启动它用户。...echo "abc" | wc 标准文件操作符 Linux基本哲学之一就是“一切皆文件”。Linux启动时候会默认打开三个文件描述符(输入、输出、错误输出)。...|文件描述符|英文名|描述|默认使用设备| |--|--|--| |0|STDIN|标准输入|设备默认键盘(/dev/tty0) |1|STDOUT|标准输出|设备默认显示器(/dev/tty0) |2...|STDERR|标准错误输出|设备默认显示器(/dev/tty0) 文件描述符0: 我们对Linux系统进行输入操作(比如我想查看文件列表时候,输入ls。)...文件描述符1: Linux系统给我们返回输出(比如我输入ls后,系统给我返回的当前目录中文件信息) 文件描述符2: Linux系统给我们返回错误输出 eaho "123" 1>标准输出.txt

27710

【翻译】XV6-DRAFT as of September 3,2014 第0章 操作系统接口

按照Unix惯例,进程从文件描述符0读入(标准输入),从文件描述符1输出(标准输出),将错误信息写入到文件描述符2(标准错误)。...同样,cat也不知道它是否写到了一个控制台、一个文件或其他什么地方。文件描述符使用与一些惯例——0是标准输入,1是标准输出,2是标准错误,使我们很轻松地实现了cat。...下面的示例程序wc将标准输入接到管道读取数据一端: int p[2]; char * argv[2]; argv[0]="wc"; argv[1]=0; pipe(p); if(fork()==0)...在后面这种情况中,read返回0,就好像数据读取已经到了文件结束部分(end-of-file)。读操作会一直阻塞直到不可能有新数据到来,这就是为什么我们在执行wc之前关闭子进程写端口。...当一个进程打开了这个文件,内核将系统调用read与write转发到内核设备实现上,不是传递给文件系统。 fstat用来获取文件描述符所指向对象信息。

57360

Linux下几种反弹Shell方法总结与理解

linux文件描述符:linux shell下有三种标准文件描述符,分别如下: 0 - stdin 代表标准输入,使用<或<< 1 - stdout 代表标准输出,使用>或>> 2 - stderr...,比如查看一个不存在文件,要把标准错误重定向到标准输出,如果直接cat notexistfile 2>1的话,则会将1看作是一个文件,将标准错误输出输出到1这个文件不是标准输出,&作用就是为了区分文件文件描述...下面在该命令后面加上0>&1,代表将标准输入重定向到标准输出,这里标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入了...那么,0>&2也是可以,代表将标准输入重定向到标准错误输出,标准错误输出重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程: ? ?...有了之前基础,我们知道3代表使用fsockopen函数建立socket返回文件描述符,这里将标准输入标准输出和标准错误输出都重定向到了远程 在CentOS上反向连接,输入: php -r '

1.8K10

关于 devnull 差点直播吃鞋一个小问题

它并不是一个磁盘文件,而是存在于内存中类型为 “character device file” 文件。...文件描述符与重定向 前面介绍标准输入标准输出、错误输出在描述符位置不会变化,但是它们指向是可以改变,我们用到重定向操作符 > 和 < 就是用来重定向数据流。...为了修改上面进程标准输入为 /dev/null,只需要使用 < 重定向符即可。修改前面的代码,加上 sleep 不让其退出。.../dev/null,System.in.read() 调用时读取标准输入会先来查这个文件描述符列表,看 0 号描述符指向是哪条数据流,再从这个数据流里读取数据。...grep 进程,同时将 nc 进程标准输出通过管道方式连接到 grep 进程标准输入 zsh 进程启动了 wc 进程,同时将 grep 进程标准输出通过管道方式连接到 wc 进程标准输入

51320

Linux之基础IO

——在磁盘 ——是硬件 ——通过OS访问 所以,访问磁盘不能绕过OS——要使用OS提供接口——OS必定要提供文件级别的系统调用接口。...C语言阶段,我们知道C程序会默认打开三个标准输入输出流:stdin(标准输入设备键盘)、stout(输出设备显示器)、stderr(显示器) 对于C语言FILE,我们其实不是很熟悉。...访问文件时,是用底层open系统调用接口,它访问文件需要用到文件描述符,在C语言中,我们访问文件是FILE不是文件描述符,因此可以推测出,FILE中必定有一个文件描述符字段。...为什么这里.test没有直接打印出结果呢? 答:fd = 1对应标准输出,即我们将要打印内容写到标准输出。...比如:调用fwrite(stdout,…);无论底层指向如何改变,上层都会用到stdin(标准输入),stdout(标准输出),stderr(标准错误)对应文件描述符0,1,2.当我们将3号描述符对应文件指针赋值给

16530

【高级编程】linux进程间通信总结

,父进程由管道向子进程传输数据,直接对管道描述符调用read和write。...我们知道,一个进程预定义了三个流,标准输入标准输出和标准出错,所以,管道更常用方法是将管道描述符复制为标准输入标准输出,在此之后通常子进程执行另一个程序,该程序从标准输入(已经创建管道)读数据,...如果type是"r",则文件指针连接到cmdstring标准输出。如果type是"w",则文件指针连接到cmdstring标准输入使用popen减少了代码编写量。...如果互相通信几个进程没有从公共祖先那里继承文件描述符,可以使用FIFO,文件系统中路径名是全局,各进程都可以访问,因此可以用文件系统中路径名来标识一个IPC通道。...与文件描述符不同,IPC标示符不是整数,当一个IPC结构被创建,以后又被删除时,与这种结构相关标示符连续加1,直至达到一个整形数最大值,然后又回转到0。 标示符是IPC对象内部名。

1.9K70

反弹Shell

服务 B主机连接到A主机9090tcp服务 A主机通过tcp服务把命令发到B主机 B主机读取命令并且在bash中执行 B主机把执行结果发给A主机 Linux文件描述符,Linux...shell三种标准文件描述符 0 - stdin 代表标准输入,使用<或<< 1 - stdout 代表标准输出,使用>或>> 2 - stderr 代表标准错误输出,使用2>或2>> 参数解释:...,比如查看一个不存在文件,要把标准错误重定向到标准输出,如果直接cat notexistfile 2>1的话,则会将1看作是一个文件,将标准错误输出输出到1这个文件不是标准输出,&作用就是为了区分文件文件描述...0>&1 代表将标准输入重定向到标准输出,这里标准输出已经重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程,这样的话就可以直接在远程输入了: 那么,0>&...2也是可以,代表将标准输入重定向到标准错误输出,标准错误输出重定向到了/dev/tcp/ip/port这个文件,也就是远程,那么标准输入也就重定向到了远程 python实现反弹shell: 首先本地还需要监听一个端口

70530

【Linux】 基础IO——文件(下)

文件描述符为什么从3开始使用?...,在启动时候,默认会打开当前进程三个文件标准输入标准输出、标准错误 ——本质都是文件 C语言:标准输入(stdin) 标准输出(stdout) 、标准错误(stderr) ——文件在系统层表现...重定向本质 关闭文件描述符0后,发现从0开始可以被输出了 ---- 关闭文件描述符0和2后,发现0和2都可以被使用了 ---- 进程中,文件描述符分配规则:在文件描述符表中,最小,没有被使用数组元素分配给新文件...——dup2 输入 man dup2 查看 刚刚重定向时,需要先关闭文件描述符1,再打开文件 现在可以直接文件打开,使用dup2重定向 输出重定向对应文件描述符是1 打开myfile文件,假设其文件描述符是...,都会正常打印,因为调用write是系统调用 没有缓冲区,直接调用就写给操作系统了 而使用fprintf ,数据会先写入缓冲区 当打印到显示器中时 刷新策略:行缓冲 因为打印内容都存在\n,在调用fork

2.1K30

pyinstaller打包成无控制台程序时运行出错(与popen冲突解决方法)

我就有点纳闷:为什么有控制台打包出来exe(不使用-w参数)可以运行,使用-w参数(无控制台)打包却不能运行呢?...windows下,只有当你执行命令是shell内建命令(比如dir,copy等) 时,你才需要指定shell=True,当你执行一个基于命令行批处理脚本(bat啥时候,不需要指定此项。...stdin、stdout和stderr分别表示子程序标准输入标准输出和标准错误。 可选值有PIPE或者一个有效文件描述符(其实是个正整数)或者一个文件对象,还有None。...(仅限unix/linux) 如果把close_fds设置成True,unix/linux下会在开子进程前把除了0、1、2以外文件描述符都先关闭。在 Windows下也不会继承其他文件描述符。...注意,并不会把该目录做为可执行文件搜索目录,所以不要把程序文件所在目录设置为cwd。 如果env不是None,则子程序环境变量由env值来设置,不是默认那样继承父进程环境变量。

3.5K30

2>&1到底是什么意思

file descripter table 进程级描述符每一个条目记录了当前进程所有打开文件文件描述符,进程之间相互独立,例如一个进程使用文件描述符99,另一个进程也可以用99。...但是这个技术细节对我们认识文件描述符没有什么作用,于是按下不表了。 为什么需要文件描述符 进程进行系统调用时候,内核为什么直接返回指向文件指针呢?反而多此一举加了个fd来引用文件。...fd是为了控制权限 标准输入/标准输出/标准错误 前面说到,进程文件描述符前3项已经被默认使用了。...我们在Java中使用new Scanner(System.in)接收从键盘输入使用System.out.println()向显示器写数据,对应C语言分别是scanf()和printf()。...需要明确是,函数并非直接使用键盘和显示器,而是使用标准输入标准输出。

97210

第七章:重定向

默认情况下,标准输出和标准错误都连接到屏幕,不是保存到磁盘文件。除此之外,许多程序从一个叫做标准输入(stdin)设备得到输入,默认情况下,标准输入接到键盘。...我们使用 “>” 重定向符后接文件名将标准输出重定向到除屏幕以外另一个文件为什么我们这样做呢?因为有时候把一个命令运行结果存储到一个文件很有用处。...这讲得通,因为我们指定了一个不存在目录/bin/usr,但是为什么这条错误信息显示在屏幕上不是被重定向到文件 ls-output.txt?答案是,ls 程序不把它错误信息输送到标准输出。...虽然我们已经将这些文件前三个称作标准输入、输出和错误,shell 内部分别将其称为文件描述符0、1和2。shell 使用文件描述符提供了一种表示法来重定向文件。...有许多命令利用标准输入和输出,几乎所有的命令行程序都使用标准错误来显示它们详细信息。

16320

Linux通过匿名管道进行进程间通信

管道是一个进程连接数据流到另一个进程通道,它通常是用作把一个进程输出通过管道连接到另一个进程输入。...举个例子,在shell中输入命令:ls -l | grep string,我们知道ls命令(其实也是一个进程)会把当前目录中文件都列出来,但是它不会直接输出,而是把本来输出到屏幕上数据通过管道输出到...,即通过stdio函数(如fwrite)向被调用程序写数据,被调用程序就可以在自己标准输入中读取这些数据。...特别提醒: 1、从函数原型我们可以看到,它跟popen函数一个重大区别是,popen函数是基于文件流(FILE)工作pipe是基于文件描述符工作,所以在使用pipe后,数据必须要用底层...四、把管道用作标准输入标准输出 下面来介绍一种用管道来连接两个进程更简洁方法,我们可以把文件描述符设置为一个已知值,一般是标准输入0或标准输出1。

1.3K21

想后台运行没想到导致磁盘满了

这样可以逐层知道哪些目录有了不该有的大文件。 当然你也可以使用find直接找出大文件,比如查找当前目录下大于800M文件: $ find ....找到这样文件,其实也很简单,前面已经介绍过了: lsof |grep deleted lsof能看到被打开文件如果文件被删除了(比如使用rm命令),但是仍然有程序打开,则会是deleted状态...不完善daemon实现 通常在终端启动一个程序后,文件描述符0,1,2通常对应标准输入标准输出,标准错误。从前面的例子中也能窥见一二,它打开是/dev/pts/1,其实就是当前终端。...但是由于printf持续向标准输出打印信息,即不断向描述符1打开文件写入内容,文件又是deleted状态,最终可能会导致磁盘空间占用不断增大,但是又找不到实际文件。...是否重定向标准输入输出,完全取决于你实际应用场景,比如某些情况你可能就是需要将标准输出指向父进程文件,则可以不需要重定向。

1.1K30

Linux 进程、线程、文件描述符底层原理

Linux 中进程其实就是一个数据结构,顺带可以理解文件描述符、重定向、管道命令底层工作原理,最后我们从操作系统角度看看为什么说线程和进程基本没有区别。...每个进程被创建时,files前三位被填入默认值,分别指向标准输入流、标准输出流、标准错误流。...我们常说文件描述符」就是指这个文件指针数组索引,所以程序文件描述符默认情况下 0 是输入,1 是输出,2 是错误。 我们可以重新画一幅图: ?...明白了这个原理,输入重定向就很好理解了,程序想读取数据时候就会去files[0]读取,所以我们只要把files[0]指向一个文件,那么程序就会从这个文件中读取数据,不是从键盘: ?...那么你可能问,既然进程和线程差不多,而且多进程数据不共享,即不存在数据错乱问题,为什么多线程使用比多进程普遍得多呢?

2.3K30
领券