/ / criar ambiente de leitura / gravação usando pipes nomeados - bash, redirecionar, system-verilog

criar ambiente de leitura / gravação usando pipes nomeados - bash, redirect, system-verilog

Estou usando o RedHat EL 4. Estou usando o Bash 3.00.15.

Estou escrevendo SystemVerilog e quero emularstdin e stdout. Só posso usar arquivos porque o stdin normal e o stdout não são suportados no ambiente. Eu gostaria de usar pipes nomeados para emular stdin e stdout.

Eu entendo como criar um arquivo to_sv e from_sv usando o mkpipe e como abri-los e usá-los no SystemVerilog.

Ao usar "cat> to_sv", posso enviar seqüências de caracteres para a simulação SystemVerilog. Mas isso também gera o que estou digitando no shell.

Gostaria, se possível, de um único shell em que atue quase como um terminal UART. Tudo o que eu digito sai diretamente para "to_sv" e o que quer que seja escrito para "from_sv" é impresso.

Se eu estou lidando com isso completamente errado, sugiro de todos os modos o caminho correto! Muito obrigado,

Nachum Kanovsky

Respostas:

2 para resposta № 1

Editar: Você pode enviar para um pipe nomeado e ler de outro no mesmo terminal. Você também pode desativar as teclas para ecoar no terminal usando stty -echo.

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

Whit este comando tudo o que você escreve vai para /tmp/to e não é ecoado e tudo escrito para /tmp/from será ecoado.

Atualizar: Encontrei uma maneira de enviar todos os caracteres inseridos no / tmp / para um de cada vez. Ao invés de cat > /tmp/to use este comando:

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

0 para resposta № 2

Você provavelmente quer usar exec como em:

exec > to_sv
exec < from_sv

Ver secções 19.1. e 19.2. no Guia Avançado de Script Bash - Redirecionamento de E / S


0 para resposta № 3

Ao invés de cat /tmp/from & você pode usar tail -f /tmp/from & (pelo menos aqui no Mac OS X 10.6.7, isso impedia um impasse se eu echo mais de uma vez para /tmp/from).

Com base no código de Lynch:

# 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