2011-07-07 2 views
0

Я использую RedHat EL 4. Я использую Bash 3.00.15.создать среду чтения/записи с использованием именованных каналов

Я пишу SystemVerilog, и я хочу подражать stdin и stdout. Я могу использовать только файлы, поскольку обычный stdin и stdout не поддерживаются в среде. Я хотел бы использовать именованные каналы для эмуляции stdin и stdout.

Я понимаю, как создать файл to_sv и from_sv с помощью mkpipe, и как их открыть и использовать в SystemVerilog.

С помощью «cat> to_sv» я могу выводить строки в симуляцию SystemVerilog. Но это также выводит то, что я набираю в оболочке.

Я бы хотел, если возможно, одну оболочку, где он действует почти как терминал UART. Независимо от того, что я печатаю, вы переходите непосредственно к «to_sv», и все, что написано в «from_sv», распечатывается.

Если я собираюсь сделать это совершенно неправильно, тогда непременно предложите правильный путь! Большое вам спасибо,

Nachum Kanovsky

ответ

0

Вы, вероятно, хотите использовать exec как в:

exec > to_sv 
exec < from_sv 

Смотрите раздел 19.1. и 19.2. в Advanced Bash-Scripting Guide - I/O Redirection

+0

Я просто попытался его очень быстро. Кажется, он пока не работает для меня. То, что я пробовал, это «exec> to_sv &», а затем «exec to_sv из другой оболочки для выхода. – nachum

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 
+0

Я бы хотел, чтобы оба направления в пределах одной оболочки, если это было возможно. Как терминал UART будет работать. То, что я напечатаю, не должно повторяться. Я верю в решение cat>/tmp/a, все символы отозваны обратно. – nachum

+0

@ user832745 Я обновил свой ответ. Сначала я не понял, что вам нужно. Может быть, потому, что я никогда не использовал настоящий терминал, только терминальный эмулятор. [UART] (http: //en.wikipedia.org/wiki/Universal_asynchronous_receiver/передатчик) вещь тоже не значила для меня, может быть, потому, что у меня есть программный фон больше, чем электронный/аппаратный фон. Теперь я надеюсь, что мой ответ сделает то, что вы описываете. – Lynch

+0

Это было очень полезно! Спасибо. Он работает сейчас. Могут ли символы отправляться без буфера? В настоящее время, что я печатаю в терминале, который идет в/tmp/to, буквы отправляются только после нажатия клавиши ввода. Как я могу получить каждое нажатие клавиши без буферизации? – nachum

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 
Смежные вопросы