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

FIFO管道仅在写入结束后才读取-FIFOpipeonlyreadsafterwriteendhasclosed

ImtryingtocreateaFIFOpipebetweenapythonfileandCfile,buttheissueisthatwhenreadin

I'm trying to create a FIFO pipe between a python file and C file, but the issue is that when reading in the input from the C file, getline blocks until the writer end (in the python file) closes.

我正在尝试在python文件和C文件之间创建一个FIFO管道,但问题是当读取C文件的输入时,getline会阻塞,直到编写器结束(在python文件中)关闭。

C file:

char fifo_emg[] = "emg";
mkfifo(fifo_emg, S_IRWXU);

int fd_emg = open(fifo_emg, O_RDONLY);
FILE* fp = fdopen(fd_emg, "r");

char *line = NULL;
size_t len = 0;
ssize_t _read;
printf("Both ends open. Reading commands...\n");
while ((_read = getline(&line, &len, fp)) != -1) {
    printf("Comamnd: %s", line);
}   

Python file:

fifo = open("emg", "w");

while 1:
    line = raw_input("ENTER COMMAND: ")
    if line[0] == '!':
        break
    else:
        fifo.write(line + '\n')

fifo.close()

When i run both, I want the output from the C file to go "Command: foo" as soon as it is entered through the python input. However, data is only read in when fifo.close() is called, and it is just read in all at once. This is not really helpful since I want a constant stream of commands.

当我同时运行时,我希望C文件的输出在通过python输入输入后立即进入“Command:foo”。但是,只有在调用fifo.close()时才读入数据,并且只是一次性读取数据。这不是很有用,因为我想要一个恒定的命令流。

3 个解决方案

#1


2  

Your problem comes from the buffer. FIFO use block buffer by default. So the c program won't read anything until the write buffer of the fifo in python was full. And there's two way to change this behaviour:

你的问题来自缓冲区。 FIFO默认使用块缓冲区。因此,在python中的fifo的写缓冲区已满之前,c程序将不会读取任何内容。并且有两种方法可以改变这种行为:

  • specify the buffer mode:
  • 指定缓冲模式:

there's three buffer mode:

有三种缓冲模式:

  1. block buffer(default)
  2. line buffer
  3. no buffer at all
  4. 完全没有缓冲

What meet your needs here is the line buffer, so use fifo = open("emg", "w", 1); instead of fifo = open("emg", "w"); will fix. number 1 here instead line buffer. python doc

满足您需求的是行缓冲区,因此请使用fifo = open(“emg”,“w”,1);而不是fifo = open(“emg”,“w”);会解决的。数字1在这里而不是行缓冲区。 python doc

  • another method is force flush the buffer, use fifo.flush after the write operation.
  • 另一种方法是强制刷新缓冲区,在写入操作后使用fifo.flush。

#2


1  

yes ..forcing a flush will resolve the issue.

是..强制刷新将解决问题。

#3


0  

As immibis says in the comments, fifo.flush() solved my issue!

正如immibis在评论中所说,fifo.flush()解决了我的问题!


推荐阅读
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • Python + Pytest 接口自动化测试中 Token 关联登录的实现方法
    本文将深入探讨 Python 和 Pytest 在接口自动化测试中如何实现 Token 关联登录,内容详尽、逻辑清晰,旨在帮助读者掌握这一关键技能。 ... [详细]
  • 优化SQL Server批量数据插入存储过程的实现
    本文介绍了一种改进的SQL Server存储过程,用于生成批量插入语句。该方法不仅提高了性能,还支持单行和多行模式,适用于SQL Server 2005及以上版本。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文探讨了如何利用HTML5和JavaScript在浏览器中进行本地文件的读取和写入操作,并介绍了获取本地文件路径的方法。HTML5提供了一系列API,使得这些操作变得更加简便和安全。 ... [详细]
  • 软件工程课堂测试2
    要做一个简单的保存网页界面,首先用jsp写出保存界面,本次界面比较简单,首先是三个提示语,后面是三个输入框,然 ... [详细]
  • 本文详细探讨了Java中的ClassLoader类加载器的工作原理,包括其如何将class文件加载至JVM中,以及JVM启动时的动态加载策略。文章还介绍了JVM内置的三种类加载器及其工作方式,并解释了类加载器的继承关系和双亲委托机制。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • KMP算法是处理字符串匹配的一种高效算法它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配。从渐进的意义上说,这样时间复 ... [详细]
  • 本文将指导如何向ReactJS计算器应用添加必要的功能,使其能够响应用户操作并正确计算数学表达式。 ... [详细]
  • 本文探讨了如何使用ls -lsh命令排除总大小输出,仅显示文件大小的方法,并提供了几种实现这一目标的解决方案。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • HDU 2871 内存管理问题(线段树优化)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2871。本题涉及内存管理操作,包括重置、申请、释放和查询内存块。通过使用线段树进行高效管理和维护。 ... [详细]
  • 本文探讨了在渗透测试中信息收集阶段使用的几种端口扫描技术,包括nmap、masscan、socket、telnet及nc等工具的应用与比较。 ... [详细]
author-avatar
三八xuan_624
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有