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

在关闭stdout之后调用printf会发生什么?

在关闭stdout之后调用printf会导致printf函数无法将输出内容发送到标准输出流(stdout)。stdout是一个文件指针,它通常指向显示器或终端窗口,用于输出信息。当关闭stdout后,printf函数将无法将输出内容显示在终端上。

具体表现取决于操作系统和编程环境。一般情况下,printf函数会返回一个非负值,表示成功打印的字符数。但由于stdout已关闭,printf函数无法将输出内容发送到显示器上,因此输出将被丢弃或被重定向到其他地方。

关闭stdout通常是通过重定向或关闭文件描述符来实现的。在某些情况下,关闭stdout可能是为了将输出重定向到文件或其他设备,或者是为了禁止程序输出。

需要注意的是,关闭stdout并不会影响程序的其他输出流,如stderr。因此,如果程序中使用了printf和fprintf函数分别输出到stdout和stderr,关闭stdout不会影响stderr的输出。

推荐的腾讯云相关产品:

  • 云服务器(CVM):提供可扩展的计算能力,适用于各种应用场景。链接地址:https://cloud.tencent.com/product/cvm
  • 云函数(SCF):无需管理服务器即可运行代码的事件驱动计算服务。链接地址:https://cloud.tencent.com/product/scf
  • 云数据库 MySQL 版(CDB):高性能、可扩展的关系型数据库服务。链接地址:https://cloud.tencent.com/product/cdb

请注意,以上推荐的产品仅代表腾讯云的一部分产品,更多产品和详细信息请参考腾讯云官方网站。

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

相关·内容

ReactDOM.renderreact中执行之后发生什么

_internalRoot赋值给fiberRoot同时封装callback回调,然后调用unbatchedUpdates立即更新子节点。...`createElement`的第一个参数 this.elementType = null; // 异步组件lazy component resolved之后返回的内容,一般是`function`或者...节点树中的‘parent’,用来处理完这个节点之后向上返回 this.return = null; // 指向第一个子节点 this.child = null; // 指向自己的兄弟节点,兄弟节点的...= NoWork; // Fiber树更新过程中,每个FIber都会有一个跟其对应的Fiber // 我们称他为`current workInProgress` // 渲染完成后他们交换位置...initializeUpdateQueue(fiber: Fiber): void { const queue: UpdateQueue = { // 每次操作完更新阿之后

69620

ReactDOM.renderreact源码中执行之后发生什么

_internalRoot赋值给fiberRoot同时封装callback回调,然后调用unbatchedUpdates立即更新子节点。...`createElement`的第一个参数 this.elementType = null; // 异步组件lazy component resolved之后返回的内容,一般是`function`或者...节点树中的‘parent’,用来处理完这个节点之后向上返回 this.return = null; // 指向第一个子节点 this.child = null; // 指向自己的兄弟节点,兄弟节点的...= NoWork; // Fiber树更新过程中,每个FIber都会有一个跟其对应的Fiber // 我们称他为`current workInProgress` // 渲染完成后他们交换位置...initializeUpdateQueue(fiber: Fiber): void { const queue: UpdateQueue = { // 每次操作完更新阿之后

55940
  • ReactDOM.renderreact源码中执行之后发生什么

    _internalRoot赋值给fiberRoot同时封装callback回调,然后调用unbatchedUpdates立即更新子节点。...`createElement`的第一个参数 this.elementType = null; // 异步组件lazy component resolved之后返回的内容,一般是`function`或者...节点树中的‘parent’,用来处理完这个节点之后向上返回 this.return = null; // 指向第一个子节点 this.child = null; // 指向自己的兄弟节点,兄弟节点的...= NoWork; // Fiber树更新过程中,每个FIber都会有一个跟其对应的Fiber // 我们称他为`current workInProgress` // 渲染完成后他们交换位置...initializeUpdateQueue(fiber: Fiber): void { const queue: UpdateQueue = { // 每次操作完更新阿之后

    55030

    你知道 cmd 输入 ping 之后发生什么吗? —— 详解 ICMP 协议

    解释之前我们先来了解一下 ICMP 报文。 ICMP 报文 ? ❔ 为什么要引入 ICMP 协议 ?...下面我们来看一下它什么时候不需要发送: 1️⃣ 对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。 2️⃣ 对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。...再来看一个Traceroute 的应用举例: 1️⃣ Windows 操作系统中这个命令是 tracert。 2️⃣ 用来跟踪一个分组从源点到终点的路径。...if(timeout>1000) { Console.WriteLine("Time Out") ; recd=true; } } //关闭...cksum += Convert.ToInt32( buffer[counter] ); counter += 1; size -= 1; } /* 若ICMP报头为奇数个字节,剩下最后一字节

    70730

    面试环节:浏览器输入 URL 回车之后发生什么?(超详细版)

    浏览器缓存 浏览器先检查是否缓存中,没有则调用系统库函数进行查询。 2....什么是 DNS 劫持 前端 dns-prefetch 优化 三、TCP 连接 TCP/IP 分为四层,发送数据时,每层都要对数据进行封装: 1....否则服务器按照规则把请求重写到 一个 REST 风格的 URL 上。 然后根据动态语言的脚本,来决定调用什么类型的动态文件解释器来处理这个请求。...然后遍历渲染树,调用渲染器的 paint() 方法屏幕上显示其内容。 6.5. 合并渲染层 把以上绘制的所有图片合并,最终输出一张图片。 6.6....微任务的执行在宏任务的同步任务之后异步任务之前。

    60830

    ReactDOM.renderreact源码中执行之后发生什么?_2023-02-19

    _internalRoot赋值给fiberRoot同时封装callback回调,然后调用unbatchedUpdates立即更新子节点。...`createElement`的第一个参数 this.elementType = null; // 异步组件lazy component resolved之后返回的内容,一般是`function`或者...节点树中的‘parent’,用来处理完这个节点之后向上返回 this.return = null; // 指向第一个子节点 this.child = null; // 指向自己的兄弟节点,兄弟节点的...= NoWork; // Fiber树更新过程中,每个FIber都会有一个跟其对应的Fiber // 我们称他为`current workInProgress` // 渲染完成后他们交换位置...initializeUpdateQueue(fiber: Fiber): void { const queue: UpdateQueue = { // 每次操作完更新阿之后

    50310

    当你浏览器中输入Google.com并且按下回车之后发生什么

    这个系统扫描每个键的状态,对于按键开关的电位弹跳变化进行噪音消除(debounce),并将其转化为键盘码值。在这里,回车的码值是13。键盘控制器得到码值之后,将其编码,用于之后的传输。...之后它又去调用 Win32K.sys ,在这之前有可能把消息传递给安装的第三方键盘过滤器。这些都是发生在内核模式。...,将自己的SEQ序列号也增加N ●另一方确认接收到这个数据包(或者一系列数据包)之后,它发送一个ACK包,ACK的值设置为接收到的数据包的最后一个序列号 关闭连接时: ●要关闭连接的一方发送一个FIN包...服务器下面可能会关闭连接,如果客户端请求保持连接的话,服务器端保持连接打开,以供以后的请求重用。...如果请求的内容是 HTML,渲染引擎解析 HTML 和 CSS,然后将内容展示屏幕上 ●网络组件 网络组件负责网络调用,例如 HTTP 请求等,使用一个平台无关接口,下层是针对不同平台的具体实现 ●

    1.3K130

    Linux基础IO【II】真的很详细

    接着,我们试试关闭之后写入受什么影响。...原因是什么? 这是因为我们将0号文件描述符关闭后,0号文件描述符就不指向标准输入流了。但是当使用输入函数输入时,他们仍然向0号中输入,但0号已经不指向输入流了,所以就无法完成输入。...但是上层并不知道输入文件流对应的文件描述符已经发生改变,所以当调用printf函数时,仍然向1号文件描述符中输出。...但是上层并不知道输入文件流对应的文件描述符已经发生改变,所以当调用printf函数时,仍然向0号文件描述符中输出。...所以我们强制刷新缓冲区调用fflush时,都要传入一个FILE*类型的指针;我们关闭一个进程调用fclose时,也要传入一个FILE*类型的指针。因为FILE结构体内部包含一个缓冲区。

    7010

    【Linux】开始了解重定向

    ,也发现关闭1 (标准输出)就我们打印出来,我们再来探究一下:如果我们关闭了 标准输出,并打开了一个文件,那么该文件就成为了1 ,来看看会发生什么现象: 1 #include...又因为stdout是对系统的封装,里面封装了 1 号文件 那么stdout 的指向没有发生改变(还是1 号文件),所以自然就打印到了log.txt中去了!....以往的 printf fprintf都是先讲内容写到语言级的缓冲区里写到文件内核缓冲区了,所以fflush作为一个系统调用,就是刷新文件内核缓冲区,使其输出到文件中!!!...所以我们操作系统与语言层中,我们的printf 和 fprintf就不需要考虑我们如何将内容写入到文件中,这不是他们需要关心的事情!!! 那为什么拷贝两次呢???...现象 2 : 按理说我们fork()之后,创建了子进程,子进程继承父进程的代码与数据。那么为什么显示器只打印了一遍呢???

    8810

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

    ("hello printf->stdout\n");//向stdout进行输出 fprintf(stdout,"hello printf->stdout\n ");//将数据向stdout...,这叫做输入重定向 追加重定向 关闭文件描述符1后,导致printf不会打印显示器上,而是追加到log.txt文件中 运行可执行程序,无显示,都追加到log.txt文件中 ---- 重定向函数...节省调用者的时间 系统调用花费时间 可能写了10次,如果每次调用fprintf传给操作系统 都要花费时间 但若都写入缓冲区中,统一传给操作系统 效率就变高了 ---- write接口不论有没有重定向...,都会正常打印,因为调用write是系统调用 没有缓冲区,直接调用就写给操作系统了 而使用fprintf ,数据先写入缓冲区 当要打印到显示器中时 刷新策略:行缓冲 因为打印的内容都存在\n,调用fork...时,打印的内容已经缓冲区中被刷新走了,刷新之后fork就没有任何意义了 所以fork就什么也没干 当打印到普通文件时 刷新策略:全缓冲 使用 hello world 没办法把缓冲区写满,就无法刷新,

    2.1K30

    【Linux】理解系统中一个被打开的文件

    答案是不会的,因为在内核当中存在引用计数,该引用计数记录的是有多少个文件指针指向自己,当有一个文件指针把它关闭之后,引用计数减一,并不会直接关闭文件,当引用计数为 0 时,说明已经没有文件指针指向自己...当我们的 fork() 之后,总有一个进程需要先退出,子进程或者父进程,取决于OS的调度,那么当任意一个进程退出的时候,就要对缓冲区进行刷新,即发生了写入操作,就要发生写时拷贝!...但是我们发现,发生写时拷贝的都是C语言的接口,系统接口write并没有发生写时拷贝,即没有使用C语言的缓冲区,这是为什么呢?...很简单,系统调用接口是C语言之下的,它看不到语言级别的缓冲区,而是将数据直接写入到操作系统的缓冲区了!所以该数据就不属于进程了,也就不会发生写时拷贝了! 3....那么我们为什么要提高 printf调用效率呢?

    15310

    printable - 利用exit过程伪造.fini_array到可控内存

    (0); // 直接exit0,考虑利用fini_array } read之前调用了close(1)来关闭stdout流,然后有一个裸的格式化字符串漏洞...由于stderr没有关闭,可以通过半个字节的爆破将bss段上stdout指针指向和stderr同一个文件结构体,此时再调用printf函数时,就可以将内容从stderr流输出来。...修改完stdout并返回read片段后的主要任务就是泄露glibc和栈地址。但是由于栈发生了变动,泄露完后不能直接再次返回。...很碰巧的是第二次printf前,栈上第23个变量正好是储存第二次调用printf时保存函数返回地址的栈地址的指针。...虽然说修改了stdout指针,但是getshell之后直接cat文件提示文件描述符错误,需要在指令中重定向一下:cat /home/printable/printable_fl4g 1>&2;。

    60510

    基础IO的理解与操作 - fd

    对文件的操作         那么语言中(比如C语言)我们访问文件并且修改的本质又是什么呢?        ...语言接口和操作系统接口的区别         那么,从这里开始,就要分清楚,为什么语言提供访问文件的接口而不直接用操作系统的系统调用了。         ...(后面会细说)         printf实际fprintf的基础上吧传入文件的位置替换为了stdout而已。        ...重定向&追加重定向引入         那么我们这里能否改变一下呢,如果我们提前关闭了默认打开的文件呢?比如关闭显示器stdout这个文件,执行printf发生什么后果呢?...\n");fflush(stdout);  // 目前暂时不关心为什么要刷缓冲区,在后面讲缓冲区的时候讲    close(fd);}         运行程序后,结果显而易见。

    75520

    【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…

    6.C语言中,调用fread、fwrite、fopen、fclose、等接口对磁盘中的文件进行操作,实际上必须等到代码和数据加载到内存中,变成进程之后,cpu读取进程对应的代码,然后操作系统才会对文件进行操作...,而不是只要我们一调用文件操作的接口就会对文件操作,而是必须将这些接口加载到内存之后,才可以。...C语言中,如果再次以写的方式打开文件,自动将原先文件中的内容清理掉,重新向文件写入内容。 自动清空原有数据,实际上是通过open系统调用中的第三个宏参数O_TRUNC来实现的。...实际上文件描述符分配时,从文件描述符表中的指针数组中,从小到大按照顺序找最小的且没有被占用的fd来进行分配,自然而然关闭0时,0对应存储的地址就会由stdin改为新打开的文件的地址,所以打印新的文件的...通过close关闭1,然后系统将新打开文件的地址分配到对应被关闭的1中的地址,然后打印到stdout的数据,就会被打印到新打开文件中,这样重定向的方式太搓了,完全可以利用系统调用dup2来进行重定向。

    1.2K30

    基础IO--重定向&&缓冲区&&stderr

    什么需要fflush函数刷新标准输出缓冲区? 每一个系统中新建的文件都会有方法表和内核文件缓冲区。 操作系统上层有系统调用和语言层,这里我们以C语言为例。...语言中层,有stdin、stdout、stderr,我们使用的printf/fprintf函数都是调用stdout。...如果 oldfd 不是一个有效的文件描述符,那么调用失败,newfd 不会被关闭。.../myfile > log.txt向普通文件写入,刷新策略发生变化,即全缓冲 如果没有fork,不论重不重定向,最终数据直接写到操作系统内部,但是一旦重定向到文件时,再做写入时,这printf和fprintf...但是write调用直接写到系统内核里。当在使用fork时,write数据已经写到操作系统内部,乃至硬件上,但是printf和fprintf的消息依旧语言级别的stdout对应的缓冲区中。

    8000

    Linux-基础IO

    当我们使用C语言运行一个程序的时候,操作系统默认将这三个流给打开,于是,我们使用printf、scanf、gets、puts等接口时可以直接使用。   ...因为0、1、2这三个文件描述符时默认打开的,但是这里我把它关闭(仅关闭0位置),再使用 open 创建一个文件,会发生什么?...); printf("fd5:%d\n", fd5); return 0; }   0位置的fd被我们关闭了,但当我们创建文件的时候,0号位置被新创建的文件占用了。...✈️重定向   了解了什么是文件描述符之后,我们就可以根据文件描述符的规则来实现不同的重定向功能。   ...而write为什么只打印一次?这是因为write函数是系统调用,并 不参与 语言层的缓冲区,所以只打印一次。

    9510
    领券