热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C-stdin,unix管道和EOF-C-stdin,unixpipelineandEOF

Iamwritinganapplicationwhichfirstreceivesdatafromaunixpipeline,andthenpromptingtheu

I am writing an application which first receives data from a unix pipeline, and then prompting the user for input. What I cannot seem to figure out is why the input from the pipeline does not seem to close properly before prompting the user for input. It feels like I'm missing something very elementary here.

我正在编写一个应用程序,它首先从unix管道接收数据,然后提示用户输入。我似乎无法弄清楚为什么在提示用户输入之前管道的输入似乎没有正确关闭。感觉我在这里缺少一些非常基本的东西。

I have tried all examples for flushing stdin presented here without success. This also seems potentially relevant, but I have not managed to extract any relevant answers.

我已经尝试了所有用于刷新stdin的例子而没有成功。这似乎也有可能相关,但我还没有设法提取任何相关的答案。

#include 
#include 

#define BUFSZ 1024

int main(void) {

    char *buf = calloc(BUFSZ, sizeof(char));

    while(fgets(buf, BUFSZ, stdin)) { printf("Pipe input: %s", buf); }

    printf("Enter input: ");
    fgets(buf, BUFSZ, stdin);
    printf("User input: %s", buf);

    free(buf);
    return 0;
}

Example usage and output:

用法和输出示例:

$ cat testdata2 | ./a.out
Pipe input: testdata testdata
Pipe input: testdata testdata2
Pipe input: testdata testdata3
Pipe input: testdata testdata4
Pipe input: testdata testdata5
Pipe input: testdata testdata6
Pipe input: testdata testdata7
Enter input: User input: testdata testdata7
$

How can it be that the second fgets() (intended for keyboard input) never touches the buffer?

怎么可能第二个fgets()(用于键盘输入)从不接触缓冲区?

This MCVE has been compiled tested on OSX and Linux with identical results.

该MCVE已经在OSX和Linux上进行了编译测试,结果相同。

1 个解决方案

#1


5  

If stdin is a pipe, then stdin is not the terminal. When you get to the end of the pipe, that's it! That's the end of stdin. You're expecting some kind of magical transformation where stdin stops being the pipe and starts being something else. Don't expect that. It's still the pipe. And EOF has occurred. For pipes, EOF is a permanent condition. Once you've hit EOF, you won't ever get anything more.

如果stdin是管道,那么stdin不是终端。当你到达管道的尽头时,就是这样!那是stdin的结束。你期待某种神奇的转变,其中stdin不再是管道并开始成为别的东西。不要指望那样。它仍然是管道。并且EOF已经发生。对于管道,EOF是永久性条件。一旦你击中EOF,你将永远得不到任何东西。

Do check the return value of fgets every time. You'll see that the last one returns null, because it's at EOF.

每次都要检查fgets的返回值。你会看到最后一个返回null,因为它在EOF。

Programs that want to read piped stdin and also get keyboard input must open the terminal separately, as in FILE *tty = fopen("/dev/tty", "r");

想要读取管道stdin并获得键盘输入的程序必须单独打开终端,如FILE * tty = fopen(“/ dev / tty”,“r”);


推荐阅读
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 探讨ChatGPT在法律和版权方面的潜在风险及影响,分析其作为内容创造工具的合法性和合规性。 ... [详细]
  • 本题要求在一组数中反复取出两个数相加,并将结果放回数组中,最终求出最小的总加法代价。这是一个经典的哈夫曼编码问题,利用贪心算法可以有效地解决。 ... [详细]
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
  • 本文探讨了如何使用pg-promise库在PostgreSQL中高效地批量插入多条记录,包括通过事务和单一查询两种方法。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 本文介绍如何在Java中实现一个罗马数字计算器,重点在于如何通过循环和字符验证确保用户输入合法。我们将探讨创建一个方法来检查字符串中的非法字符,并使用循环不断提示用户输入,直到输入符合要求。 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本文旨在探讨如何利用决策树算法实现对男女性别的分类。通过引入信息熵和信息增益的概念,结合具体的数据集,详细介绍了决策树的构建过程,并展示了其在实际应用中的效果。 ... [详细]
  • 2017-2018年度《网络编程与安全》第五次实验报告
    本报告详细记录了2017-2018学年《网络编程与安全》课程第五次实验的具体内容、实验过程、遇到的问题及解决方案。 ... [详细]
  • 本文详细介绍了Java编程中的基本运算符,包括算术、赋值、关系和逻辑运算符,并深入探讨了三元运算符的使用。此外,还讲解了如何使用Scanner类进行用户输入处理以及if和switch语句等流程控制结构。 ... [详细]
  • 深入浅出TensorFlow数据读写机制
    本文详细介绍TensorFlow中的数据读写操作,包括TFRecord文件的创建与读取,以及数据集(dataset)的相关概念和使用方法。 ... [详细]
author-avatar
安小辰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有