【问题标题】:create read/write environment using named pipes使用命名管道创建读/写环境
【发布时间】:2011-07-07 03:28:44
【问题描述】:

我正在使用 RedHat EL 4。我正在使用 Bash 3.00.15。

我正在编写 SystemVerilog,我想模拟标准输入和标准输出。我只能使用文件,因为环境中不支持普通的标准输入和标准输出。我想使用命名管道来模拟标准输入和标准输出。

我了解如何使用 mkpipe 创建 to_sv 和 from_sv 文件,以及如何在 SystemVerilog 中打开和使用它们。

通过使用“cat > to_sv”,我可以将字符串输出到 SystemVerilog 模拟。但这也会输出我在 shell 中输入的内容。

如果可能的话,我想要一个类似于 UART 终端的外壳。我输入的任何内容都会直接输出到“to_sv”,而写入“from_sv”的任何内容都会被打印出来。

如果我完全错了,那么一定要建议正确的方法!非常感谢,

纳楚姆·卡诺夫斯基

【问题讨论】:

    标签: bash redirect system-verilog


    【解决方案1】:

    编辑:您可以输出到命名管道并从同一终端中的另一个管道读取。您还可以使用stty -echo 禁用要回显到终端的键。

    mkfifo /tmp/from
    mkfifo /tmp/to
    stty -echo
    cat /tmp/from & cat > /tmp/to
    

    使用此命令,您写入的所有内容都会发送到 /tmp/to 并且不会被回显,而写入到 /tmp/from 的所有内容都会被回显。

    更新:我找到了一种将输入到 /tmp/ 的每个字符一次发送到一个的方法。而不是cat > /tmp/to 使用这个命令:

    while IFS= read -n1 c;
    do  
       if [ -z "$c" ]; then 
          printf "\n" >> /tmp/to; 
       fi; 
       printf "%s" "$c" >> /tmp/to; 
    done
    

    【讨论】:

    • 如果可能的话,我想要的是单个外壳内的两个方向。就像 UART 终端一样可以工作。我输入的内容不应该被回显。我相信使用 cat > /tmp/a 解决方案,所有字符都会回显。
    • @user832745 我更新了我的答案。起初我没有正确理解你需要什么。可能是因为我从来没有使用过真正的终端,只有终端模拟器。 UART 对我来说也没什么意义,可能是因为我的软件背景多于电子/硬件背景。现在我希望我的回答和你描述的一样。
    • 这很有帮助!谢谢你。它现在正在工作。可以无缓冲地发送字符吗?目前我在终端中输入的内容,即 /tmp/to,只有在我按下回车后才会发送这些字母。我怎样才能让每个按键都没有被缓冲?
    • 很难找到一次发送每个密钥的方法。 cat, dd 接缝等待\n 即使您设法使用read -n1 c; echo "$c" 一次仅读取一个字符,它也不处理空格或换行符。生病再检查一下,看看我能找到。可能是诅咒软件?或者像 minicom 这样的终端就可以了。
    • 我已经更新了我的解决方案,每次将每个字符发送到输出。
    【解决方案2】:

    您可能想使用exec,如:

    exec > to_sv
    exec < from_sv
    

    请参阅 19.1.19.2 部分。在Advanced Bash-Scripting Guide - I/O Redirection

    【讨论】:

    • 我刚刚试过很快。它似乎还没有为我工作。我尝试的是'exec > to_sv &',然后是'exec to_sv 作业也退出。
    【解决方案3】:

    您可以使用tail -f /tmp/from &amp; 而不是cat /tmp/from &amp;(至少在Mac OS X 10.6.7 上,如果我将echo 多次发送至/tmp/from,这可以防止死锁)。

    基于林奇的代码:

    # terminal window 1
    (
    rm -f /tmp/from /tmp/to
    mkfifo /tmp/from
    mkfifo /tmp/to
    stty -echo
    #cat -u /tmp/from & 
    tail -f /tmp/from & 
    bgpid=$!
    trap "kill -TERM ${bgpid}; stty echo; exit" 1 2 3 13 15
    while IFS= read -n1 c;
    do  
      if [ -z "$c" ]; then 
        printf "\n" >> /tmp/to
      fi; 
      printf "%s" "$c" >> /tmp/to
    done
    )
    
    # terminal window 2
    (
    tail -f /tmp/to & 
    bgpid=$!
    trap "kill -TERM ${bgpid}; stty echo; exit" 1 2 3 13 15
    wait
    )
    
    # terminal window 3
    echo "hello from /tmp/from" > /tmp/from
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多