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

使用带有stdin和stdout重定向的2进程管道时如何避免在stdin上重复输入

我打算在两个进程之间建立一条管道:父进程和子进程。父进程派生子进程,并使用ex

我打算在两个进程之间建立一条管道:父进程和子进程。父进程派生子进程,并使用execve将其映像替换为指定进程的映像。

父级通过std :: getline(std :: cin,input_line)从stdin中读取。
子级通过std :: cout

我正在寻找一个管道,并将子级的输出重定向到父级的输入。

问题是父级两次收到每个输入(每个输入是孩子在stdout上输出的数字)。我想解决此问题,但我不知道为什么会发生。

代码使用g ++ 7.4.0和C ++ 11标准版本进行编译。

子级被编译为名为“ p1”的二进制文件。

父代码:

#include
#include
#include
#include
char *
const p1argv[] = {
(char * )
"./p1",nullptr
};
char *
const p1envp[] = {
(char * ) nullptr
};
int main(int argc,char ** argv) {
pid_t p1id;
int p1fd[2];
pipe(p1fd);
if (p1id = fork() == 0) {
close(p1fd[0]);
dup2(p1fd[1],STDOUT_FILENO);
execve(argv[0],p1argv,p1envp);
perror("Error: failed to execve ./p1.");
} else {
dup2(p1fd[0],STDIN_FILENO);
close(p1fd[1]);
std::string line;
while (std::getline(std::cin,line)) {
std::cout <<"d(" < }
int status;
waitpid(p1id,& status,0);
close(p1fd[0]);
}
}

子代码:

#include
#include
int main(int argc,char** argv) {
long it = 0;
while(true) {
it += 1;
std::cout < std::this_thread::sleep_for(std::chrono::seconds(2));
}
}

示例代码的实际输出为:

d(d(1))
d(d(2))
...

预期输出为:

d(1)
d(2)
...


问题是这一行:

execve(argv[0],p1argv,p1envp);

正在重新执行主父程序,因为这就是argv[0]的内容。我认为您想找到一种在此处指定"./p1"的方法。


推荐阅读
  • 主调|大侠_重温C++ ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 在编译BSP包过程中,遇到了一个与 'gets' 函数相关的编译错误。该问题通常发生在较新的编译环境中,由于 'gets' 函数已被弃用并视为安全漏洞。本文将详细介绍如何通过修改源代码和配置文件来解决这一问题。 ... [详细]
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • Python自动化测试入门:Selenium环境搭建
    本文详细介绍如何在Python环境中安装和配置Selenium,包括开发工具PyCharm的安装、Python环境的设置以及Selenium包的安装方法。此外,还提供了编写和运行第一个自动化测试脚本的步骤。 ... [详细]
  • CentOS 6.8 上安装 Oracle 10.2.0.1 的常见问题及解决方案
    本文记录了在 CentOS 6.8 系统上安装 Oracle 10.2.0.1 数据库时遇到的问题及解决方法,包括依赖库缺失、操作系统版本不兼容、用户权限不足等问题。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 通常情况下,修改my.cnf配置文件后需要重启MySQL服务才能使新参数生效。然而,通过特定命令可以在不重启服务的情况下实现配置的即时更新。本文将详细介绍如何在线调整MySQL配置,并验证其有效性。 ... [详细]
  • Symfony是一个功能强大的PHP框架,以其依赖注入(DI)特性著称。许多流行的PHP框架如Drupal和Laravel的核心组件都基于Symfony构建。本文将详细介绍Symfony的安装方法及其基本使用。 ... [详细]
  • 本文详细解释了为什么在成功执行移动赋值操作后,对象的析构函数会被调用,并提供了代码示例和详细的分析。 ... [详细]
  • 本文介绍了如何使用暴力方法解决HDU5444问题。代码通过逐个检查输入数据,确保在所有情况下都能找到正确的解决方案。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 访问一个网页的全过程
    准备:DHCPUDPIP和以太网启动主机,用一根以太网电缆连接到学校的以太网交换机,交换机又与学校的路由器相连.学校的这台路由器与一个ISP链接,此ISP(Intern ... [详细]
author-avatar
_自己疼__374
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有