使用命名管道创建读/写环境

时间:2011-07-07 03:28:45

标签: bash redirect system-verilog

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

我正在编写SystemVerilog,我想模仿stdin和stdout。我只能将文件用作普通的stdin,并且环境中不支持stdout。我想使用命名管道来模拟stdin和stdout。

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

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

如果可能的话,我想要一个单独的shell,它的行为几乎就像一个UART终端。无论我输入的是什么,都会直接输出到“to_sv”,而写入“from_sv”的内容会被打印出来。

如果我对此完全错误,那么无论如何都要建议正确的方法!非常感谢你,

Nachum Kanovsky

3 个答案:

答案 0 :(得分:2)

编辑:您可以输出到命名管道并从同一终端中的另一个管道读取。您还可以使用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

答案 1 :(得分:0)

您可能希望使用exec,如下所示:

exec > to_sv
exec < from_sv

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

答案 2 :(得分:0)

而不是cat /tmp/from &您可以使用tail -f /tmp/from &(至少在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