当前位置: 首页 > 知识库问答 >
问题:

在两个进程(第2个)之间使用命名管道有什么问题?

龙霖
2023-03-14

那么,让我们从头开始:2个进程1个管道进行通信,对吗?不由于通信阻塞,一方等待另一方。我们需要通过另一个渠道获得第二个过程的结果。虽然这似乎是多余的,但事实并非如此。

让我们稍微改变一下:2个进程2个管道,您可以将一个进程称为服务器,另一个进程称为客户端。一个管道将作业发送到客户端,另一个管道用于将结果从客户端收集到服务器。

为了方便起见,我们使用进程名来调用每个管道,该进程名用于读取so、london读取london管道等等。这是管道和流程图:

london ----writes madrid pipe-------->
london <----reads london pipe------  |
                                  ^  |
                                  |  |
madrid ----writes london pipe----->  v
madrid <----reads madrid pipe---------

让我们使用“伦敦”作为服务器,“马德里”作为客户端:服务器负责结束无休止的循环。

这就是解决方案:

#!/bin/bash
shopt -u failglob
shopt -s extglob nullglob dotglob

DIR=$( cd "$( dirname "$0" )" && pwd )

function london (){
   local i message answer london madrid
   london=london_$RANDOM.$RANDOM.$RANDOM.$$
   madrid=madrid_$RANDOM.$RANDOM.$RANDOM.$$
   cd $DIR
   mkfifo $london
   mkfifo $madrid
   ( madrid $madrid $london ) &
   echo "parent id: $$, child id: $!"
   i=0
   #a mesterious situation: sometimes '3< $london' just breaks it (?!)
   exec 3<> $london
   exec 4> $madrid

   while true; do

      message="Greetings from London!($i)"
      echo "$message" >&4

      read -r answer <&3
      echo 'London says:> '"$answer" #>& /dev/stdout
      (( i++ ))

      if [[ i -gt 1 ]]; then
         echo 'quit' >&4
         break
      fi
   done

   wait
   cd "$DIR"
   rm -rf $london
   rm -rf $madrid
}

function madrid (){
   local i message answer madrid london
   madrid=$1
   london=$2
   cd $DIR
   i=0
   exec 3> $london
   exec 4< $madrid
   while true; do

      read -r answer <&4
      echo 'Madrid says:> '"$answer" #>& /dev/stdout

      message="Greetings from Madrid!($i)"
      echo "$message" >&3
      (( i++ ))

      if [[ $answer = 'quit' ]]; then
         break
      fi
   done
}

london

函数'London'前面有一条评论

   exec 3<> $london

如果你把这个改成

   exec 3< $london

因为它应该(!)那时,我面临着我的程序反复停滞的情况!经过一些改变

共有1个答案

乐正秦斩
2023-03-14

在这里,由于tty输出,程序仅在后台启动时停止。当您可以重现问题时,您应该将strace附加到第一个进程。

 类似资料:
  • 我试图使用命名管道在同一台机器上的服务器和客户端进程之间进行通信。服务器向客户机发送一条消息,客户机对其执行操作并返回结果,服务器应该得到结果。 这里是服务器的代码: 以下是客户端的代码: 但是在服务器代码中,在线pipeServer。WaitForPipeDrain();我得到一个ObjectDisposedException,它说“无法访问封闭管道。” 在设置sw时,我在打开的客户端代码中也会

  • 问题内容: 我正在尝试在两个程序之间创建双向通信通道(一个在Python中,另一个在C#中) 当我在两个C#程序或两个Python程序之间创建一个命名管道时,一切都很好,但是当我尝试(例如)从Python代码连接到C#服务器时,它不起作用: C#代码: 如果我在Python中使用代码块(永远不会返回) 如果我使用open函数,它只会建立连接,但不会发生任何事情: 现在,如果我关闭Python程序,

  • 我想运行以下命令: 通过一些搜索,我发现这可能是由于没有设置JAVA_HOME的错误,但它在主节点的~/.bashrc中设置正确 hadoop clustter是一个Amazon Elastic Map Reduce集群。

  • 我试图同时按下多个键的功能。我找到了一些答案。我在关注这个。 多键关闭 问题是我有一些代码可以工作。但我的版本不起作用。我完全不知道发生了什么。 答案中的代码 我的代码版本是。 在我的代码版本中,第一部分不起作用。我不知道为什么?

  • 我想在多个python进程之间共享。以便从其他python进程发送。 如何跨多个python进程共享。 代码如下: 目标是从通道从其他python进程发送。