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

为什么在替换了stdin之后,我的管道不能读入printf?

在替换了stdin之后,管道无法读取printf的原因是因为printf函数默认将输出发送到标准输出stdout,而不是管道。当你替换了stdin后,管道的输入端已经改变,无法再从标准输出中读取数据。

要解决这个问题,你可以使用重定向操作符将printf的输出重定向到管道。在Unix/Linux系统中,可以使用符号“|”将两个命令连接起来,将前一个命令的输出作为后一个命令的输入。例如:

代码语言:txt
复制
printf "Hello, World!" | your_program

在这个例子中,printf的输出被重定向到管道,作为your_program的输入。你需要将your_program替换为你实际使用的程序。

另外,如果你想在C语言中实现类似的功能,可以使用管道函数(pipe)创建一个管道,并使用dup2函数将管道的写端复制到标准输出。示例代码如下:

代码语言:txt
复制
#include <stdio.h>
#include <unistd.h>

int main() {
    int fd[2];
    pipe(fd);

    if (fork() == 0) {
        // 子进程
        close(fd[0]); // 关闭管道的读端
        dup2(fd[1], STDOUT_FILENO); // 将管道的写端复制到标准输出
        execlp("printf", "printf", "Hello, World!", NULL);
    } else {
        // 父进程
        close(fd[1]); // 关闭管道的写端
        // 从管道的读端读取数据
        char buffer[100];
        read(fd[0], buffer, sizeof(buffer));
        printf("Received: %s\n", buffer);
    }

    return 0;
}

这段代码创建了一个管道,并使用fork函数创建了一个子进程。子进程使用execlp函数调用printf命令,将输出重定向到管道。父进程则从管道中读取数据,并打印出来。

希望以上解答对你有帮助。如果你需要更多关于云计算或其他相关主题的信息,请随时提问。

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

相关·内容

记一次传递文件句柄引发血案

apue 上讲 Solaris 系统是可以进程间通过 STREAMS 管道传递文件句柄。...它关闭管道另一端,然后fork出子进程中将另一端重定向到子进程标准输入、输出。...之后不断从console读入用户输入两个整数,创建一个临时文件(get_temp_fd)并将用户输入写入文件, 之后通过管道将此临时文件传递给子进程,然后管道上等待子进程返回另一个临时文件句柄,...这就奇怪了,读取管道返回这个错误唯一原因只能是管道被关闭,而此管道子进程端已经被重定向到了标准输入、标准输出, 当标准输入输出关闭时,唯一可能性是进程已经退出。难道子进程已经不在了么?...那为什么子进程什么数据也没有从临时文件句柄中读到呢?

50220

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

这比较奇怪,为什么去读 stdin 会返回 EOF 呢? 接下来去看 fd 为 0 stdin 到底指向了什么。...所有的往这个文件写入数据会被丢弃,write 调用会是始终返回成功,这个特殊文件不会被填满,也不能更改它文件大小。...为什么本机测试没有出现问题?因为本机测试是用终端 terminal 去启动 jar 包,这样进程 stdin 会被分配为键盘输入,不输入字符情况下,会始终阻塞。...cat foo.txt > output.txt 2>&1 接下来继续看文件描述符与管道相关概念。 管道 管道是一个单向数据流,我们命令行中经常会用到管道来连接两条命令,以下面的命令为例。... linux 中,创建管道函数是 pipe,常见创建管道方式如下所示。

58720
  • 【第二期】一次学透java.io

    数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长数据流。...不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时效果都是完全一样为什么要有这种抽象呢?...标准输入输出 命令行参数 从键盘上读入数据,最简捷方式就是通过命令行参数。可能很多同学第一次写Java程序时候,对main方法参数就会有疑问,不知道它是干啥。...标准输入输出错误 大家知道,控制台程序中,有三个可以进行输入输出通道,我们通常称之为标准输入,标准输出和标准错误。C语言中,我们会以stdin, stdout, stderr来代指。...Scanner 文章最后,还想额外提一下Scanner类。这是一个用于输入辅助类,是从Java1.5开始引入。在那之前,如果想从标准输入里读两个数,并把它们和打出来。

    758100

    Python重定向标准输入、标准输出和标

    标准输出和标准错误(通常缩写为 stdout 和 stderr)是建立每个UNIX系统内管道(pipe)。...这样挺好,因为一旦程序崩溃(由于我们异常),Python将我们清理和关闭文件,并且 stderr 永远不恢复不会造成什么不同。因为,提到过,一旦程序崩溃,则Python也结束。... kgp.py 中从标准输入读入 def openAnything(source): if source == "-": import sys return sys.stdin...我们所做全部是函数开始处添加三行代码,用来检查是否 source 是“-”,如果是,我们返回sys.stdin。实际上,就是这样!...记住,stdin 是一个带有 read 方法类文件对象,所以我们代码其余部分( kgp.py 中,我们调用 openAnything 地方)一点没有改变。

    4K10

    笔记 Lab1: Unix utilities | Unix 实用工具

    这是自学 MIT6.S081 操作系统课程 lab 代码笔记第一篇:Unix utilities。此 lab 大致耗时:4小时。...,退出程序 exit(0); } printf("prime %d\n", p); int pright[2]; pipe(pright); // 创建用于输出到下一 stage 进程输出管道...解决方法有两部分: 关闭管道两个方向中不需要用到方向文件描述符(具体进程中将管道变成只读/只写)原理:每个进程从左侧读入管道中只需要读数据,并且只需要写数据到右侧输出管道,所以可以把左侧管道写描述符...,以及右侧管道读描述符关闭,而不会影响程序运行 这里注意文件描述符是进程独立某个进程内关闭文件描述符,不会影响到其他进程 子进程创建后,关闭父进程与祖父进程之间文件描述符(因为子进程并不需要用到之前...stdin 读入参数 char **args = argsbuf; // 指向 argsbuf 中第一个从 stdin 读入参数 for(int i=1;i<argc;i++) { //

    1.1K30

    C语言中从键盘输入字符串时一些问题

    C语言中从键盘输入字符串时一些问题 1.scanf() scanf()输入字符串时有很大弊端, 例如: 1). scanf()在从键盘读入字符时并不会根据所定义字符数组大小来控制读入多少个...str中 其中n是要求得到字符个数 , 但实际上只会读入(n – 1)个,最后加一个’\0’ ....’\n’ 3). fgets()函数连续输入多个字符串时(也不能算是fgets()函数缺点) , 但有时也会给我们带来麻烦) , 例如: char str1[10]; char str2[10...("请输入字符串str\n"); fgets(str, N, stdin); printf("请输入字符串str1\n"); fgets(str1, N, stdin); printf("请输入字符串str2...如图, 即可以输入空格, 也不会越界 , 也没有从缓存区读取字符存入字符数组问题 小结 : C语言中输入一个字符串时应该根据实际情况 , 灵活运用输入方法 , 并不是有缺点就不能用 .

    1.7K20

    进程间通信之CreatePipe

    大家好,又见面了,是你们朋友全栈君。 CreatePipe function 创建匿名管道,返回读,写管道handle。...SECURITY_ATTRIBUTES决定了子进程是否可以继承管道读写handle。 如果lpPipeAttributes是NULL,不能继承。 nSize [in] 管道缓冲空间。...若管道缓冲空间写之前已经满了,那么WriteFile将一直不会返回直到ReadFile读管道后有足够缓冲空间。 匿名管道是通过命名管道实现。...它使用继承标准输入STDIN和输出STDOUT访问父进程创建管道。 父进程从in.txt读数据,并把这些数据写到管道1中。子进程从管道1中通过STDIN获得数据,再通过STDOUT写到管道2中。...父进程之后再从管道2中读取数据并显示。

    96810

    很“迷”字符与字符串

    大家好o(*^▽^*)┛,是呆博~很开心又和大家见面啦~ 最近一直在为自己浏览量而担忧啦,都快被厂长大人约谈了……真的有尽力写稿子哦,所以也请各位老铁,如果觉得文章还不错就转发到朋友圈或者微信群之类...如下面的代码所示,大家可以想一下输出结果会是什么? ? 输出结果为:身高是-86厘米!。 这是为什么呢?...因为是有符号字符型,所以170 二进制表达 10101010 对应一个负数补码,而printf 输出该补码所对应数字。 《4....注意到EOF不能用char类型表示,所以getchar()函数返回是一个int型数。...其次程序中我们清除了输入缓冲区中残留,否则 getchar()会先读取缓冲区残留回车,然后在读入键盘输入部分;fflush(stdin) ubuntu 下不可用,所以注释掉了。

    1.2K20

    gets 、getchar 、fgets 、scanf用法

    其函数原型如下:   char* gets(char* buffer);   如果读入成功,则返回与参数 buffer 相同指针;如果读入过程中遇到 EOF 或发生错误,返回 NULL 指针。...也就是说,每次调用时,fgets 函数都会把缓冲区最后一个字符设为 null(’\0’),这意味着最后一个字符不能用来存放需要数据。...如果是从键盘上读入数据,可以使用 stdin 作为该参数,如下面的代码所示: int main(void) { char buffer[11]; fgets(buffer,11,stdin); printf...如果第一次输入时候超过了10个字符(其中没有按回车键).   那么第一次回车后会显示两个字符串内容,第一次输入多于10个字符保存到了第二个字符数组中。   请问这是为什么?...stdin是标准输入(也就是键盘输入),C标准库里面的一个全局变量stdin也是FILE*类型,因此使用FILE*类型作为参数地方,可以使用stdin*/ printf("%s\n%s\n",str1

    3.1K60

    浅谈 CC++ 输入输出

    关闭同步流之后, 库使用了一种不同于标准输入输出库机制来提高效率,例如使用字符串流 stringstream 和缓冲流 buffer stream 等。...这就是为什么,你仍然可以 C++ 中使用 scanf() 和 printf(),但是仍建议 C++ 中使用 库所提供标准输入输出原因,以及为什么我们常说 C++ 比 C 更适于面向对象...缓冲区中数据没有被自动清空,这就是为什么控制台根本没有鸟你后续输入东西,并输出了不符合预期内容。...) 吃掉缓冲区中 '\n' char c = getchar(); //读入一个字符,并存储 char 类型变量 c 中 printf("%c", c); //...这就是为什么,即使 C++ 宁愿舍弃 scanf() 和 printf() 高性能,也要得到输入输出流同步所带来安全性和正确性,这也使得 C++ 更适合面向对象开发。

    48640

    浅谈 CC++ 输入输出

    关闭同步流之后, 库使用了一种不同于标准输入输出库机制来提高效率,例如使用字符串流 stringstream 和缓冲流 buffer stream 等。...这就是为什么,你仍然可以 C++ 中使用 scanf() 和 printf(),但是仍建议 C++ 中使用 库所提供标准输入输出原因,以及为什么我们常说 C++ 比 C 更适于面向对象...缓冲区中数据没有被自动清空,这就是为什么控制台根本没有鸟你后续输入东西,并输出了不符合预期内容。...) 吃掉缓冲区中 '\n' char c = getchar(); //读入一个字符,并存储 char 类型变量 c 中 printf("%c", c); //...这就是为什么,即使 C++ 宁愿舍弃 scanf() 和 printf() 高性能,也要得到输入输出流同步所带来安全性和正确性,这也使得 C++ 更适合面向对象开发。

    4.9K20

    C语言缓冲区之 gets(str);fflush(stdin); rewind(stdin);setbuf(stdin, NULL);

    那么为什么需要清空键盘缓冲区呢?...("%d %d", ch1, ch2); 11 return 0; 12 } 程序本意很简单,就是从键盘读入两个字符,然后打印出这两个字符ASCII码值。...而读取时遇到回车(n)而结束,这个n会一起读入输入流缓冲区,所以第一次接受输入时取走字符后会留下字符n,这样第二次读入函数直接从缓冲区中把n取走了,显然读取成功了,所以不会再从终端读取!...其实这里10恰好是回车符!这就是为什么这个程序只执行了一次输入操作就结束原因! 【解决办法】: 清空缓冲区残留数据。...0; 21 } 上面的实例只适用于Windows系统,Linux环境下上面两种写法都是不起作用,所以还要换个函数。

    2.8K31

    开讲啦:Chap 10 对文件输入输出

    10.1 C文件有关知识 10.1.1 什么是文件 程序设计中,主要用到两种文件: 程序文件:包括源程序文件.c、目标文件.obj、可执行文件.exe等; 数据文件:文件内容不是程序,而是供程序运行时读写数据或在程序运行过程中供读入数据...("请输入读入文件名:"); scanf("%s",infile); printf("请输入要写入文件名字:"); scanf("%s",outfile); if...\n"); exit(0); } printf("排序之后字符如下:\n"); for (i = 0; i < n; i++) { fputs(...,按照顺序读写方式,则需要将前面所有人查询完成之后才可以读取;随机访问不是按数据文件中物理位置次序进行读写,而是可以对任何位置上数据进行访问,显然这种方法比顺序访问效率高得多。...、1、2代,0代表文件开始位置,1代表当前位置,2代表文件末尾位置。

    67710

    How to Use the Stdin, Stderr, and Stdout Streams in Bash

    它们是stdin、stdout和stderr。stdin 全称是标准输入,用于接受用户输入。stdout 完整形式是标准输出,用于将命令输出存储到stdout流中。...Uses of Stdin, Stdout, and Stderr下面是一些使用stdin,stdout,stderr使用案例。取出文件内容并在终端打印方法在这个例子中显示。...$ cat > testdata.txt注意输入上面的命令之后,此时shell会等待输入流进行输入,此时可以再控制台随意输入一些字符,之后按键ctrl + c**方式结束输入,此时ls当前可以看到会出现新文件...但是在后续案例中,将会介绍如何读入输入流重定向到另一个输出流:ubuntu@VM-8-8-ubuntu:~$ ls < testdata.txt testdata2.txt testdata.txtubuntu...Example 2: Use of Stdoutpipe (|) 管道符和stdout下面是一个使用管道符重定向输出并且创建文件例子。

    2.8K40

    神奇 Solaris pipe

    关于FIFO,详情可参考之前写一篇文章: [apue] FIFO:不是文件文件 而Solaris上pipe没这么多事,加入两个调用:fattach / fdetach,你就可以像使用FIFO一样使用.../pipe") < 0) 31 err_sys("fdetach error\n"); 32 33 printf("detach from file pipe ok\n"); pipe调用之后立即加入.../pipe)是个普通文件,打开读写都是磁盘IO; fattach调用之后,这个文件就变身成为一个管道了,打开读写都是内存流操作,且管道另一端就是attach那个进程。...即每个open pipe文件进程,得到不是原来管道fd,而是新创建管道fd,而管道另一侧fd则通过已有的管道发送到attach进程, 后者使用这个新fd与客户进程通讯。...之后逻辑与以前一样。

    1K20

    从零实现操作系统-Lab 1: Unix utilities

    fork 之后,父进程和子进程都有了指向管道文件描述符。子进程将管道读端口拷贝描述符0上,关闭 p 中描述符,然后执行 wc。当 wc 从标准输入读取时,它实际上是从管道读取。...parent_fd[1] 因为我们要读取parent_fd[0],管道是单工,读写端口不能被同时开启。...close(child_fd[0]);// 为什么要关掉child_fd[0] 理解是,如果要写入到child_fd[1],避免一写入就被读取,那么我们就要关闭child_fd[0],读写不能被同时开启...每个框代表一个进程,进程之间管道通信,对于每个进程,输出收到第一个数记为p,这个数必定为素数,之后收到每个数如果是第一个数p倍数,丢弃,反之发送给下一个进程。就是每个进程输出一个素数。...,ls.c里面的意思就是将de.name内容移动到p指向指针中 p[DIRSIZ] = 0; if(stat(buf, &st) < 0){ printf(

    1.1K20

    Linux工程笔记.md

    git stash list:查看栈中所有元素 thrift 官网 管道、环境变量与常用命令 管道 概念 管道类似于文件重定向,可以将前一个命令stdout重定向到下一个命令stdin。...要点 管道命令仅处理stdout,会忽略stderr。 管道右边命令必须能接受stdin。 多个管道命令可以串联。 与文件重定向区别 文件重定向左边为命令,右边为文件。...wc:统计行数、单词数、字节数 既可以从stdin中直接读入内容;也可以命令行参数中传入文件名列表; wc -l:统计行数 wc -w:统计单词数 wc -c:统计字节数 tree:展示当前目录文件结构...-3 xxx:展示xxx末尾3行内容 同时支持从stdin读入内容 用户相关 history:展示当前用户历史操作。...内容存放在~/.bash_history中 工具 md5sum:计算md5哈希值 可以从stdin读入内容 也可以命令行参数中传入文件名列表; time command:统计command命令执行时间

    5.5K10

    UNIX 高级环境编程 实验一 同步与异步write效率比较

    程序默认从标准输入 STDIN_FILENO 读取输入文件,可以利用shell输入定向功能选择具体输入文件。 ​...很明显,同步系统调用cpu时间会大大增加,关键在于每一次以buffsize读入都会强制刷新内核缓冲区,耗时上是比异步写入更高。...考虑到可能有剩余,那么就需要特殊判断一下,最后是否需要多一次读入,注意开始计时是选定一个buffSize之后,然后在所有文件内容全部读入之后结束计时,利用tms结构体获得进程用户、系统所使用CPU时间...可以看到,处理大文件时,同步读入比异步模式要慢,虽然两者小文件读入情况下几乎相似,但可以近似说同步比异步读入慢,具体原因已在上文分析过。...,以及详细区别(从原理上了解),虽说之前上过linux基础编程课,但面对第一次实验课,一开始还是束手无策,只能翻书、上网查阅资料看看他人思路,最终自己复现一遍,最终还是感觉收获了不少(真话)

    1.3K20

    CCPP输入输出函数汇总分析

    = 2){…}来判断用户输入是否正确. printf() int printf(const char *format, arg_list) printf主要是将格式化字符串输出到标准输出流中,stdio.h...;出错:返回NULL; 文件结尾:NULL; 实现:内存buf <-从stdin所指流中取1行字符-标准输入流(由fp=stdin所指) 原因:同上; 补充:不推荐使用,问题是调用者使用gets时,...而对于一次一行方式,当每次结构体中有null字符时,fputs就会停止,所以也不能用它实现读结构,同时fgets中包含有null字节或换行符,其也不能正常工作。...当从网络读时,网络中缓冲机构可能造成返回值小于所要求读字节数。 当从管道或FIFO读时,如若管道包含字节少于所需数量,那么只返回实际用字节数。...如果在打开该文件时,指定了O_APPEND选项,则在每次写操作之前,将文件偏移量设置文件的当前结尾处。一次成功写之后,该文件偏移量增加实际写字节数。

    1.2K20
    领券