Tcl / Tk - Memchan - fifo - как переименовать fifo в stdout в приложении tcl / tk, которое статически связано с Memchan? - PullRequest
0 голосов
/ 11 мая 2011

Я перекрестно разместил этот вопрос на comp.lang.tcl.

Я занимаюсь разработкой приложения Tcl/Tk (назовите его rs) и хочу перенаправить stdout и stderr натекстовое поле в моем Tcl/Tk приложении.Я использую Memchan для достижения этой цели (я статически связал Memchan в своем приложении).Но я не могу переименовать канал fifo, который я создал, как stderr.(То же самое верно и для stdout)

Например, в следующем фрагменте я закрываю stderr, а затем открываю fifo как stderr, но канал fifo остается названным как fifo0 не как stderr.

 $ rs
 rs> package require Memchan
 2.3
 rs> chan names
 stdin stdout stderr
 rs> close stderr
 rs> chan names
 stdin stdout
 rs> set stderr [fifo]
 fifo0
 rs> chan names
 fifo0 stdin stdout

Я ожидал stderr вместо fifo0, когда набрал последнюю из команд chan names.

Но когда я использую tclsh8.5 вышеуказанная последовательность дает желаемый эффект, т.е. fifo переименовывается в stderr

 $ tclsh8.5
 % package req Memchan
 2.3
 % chan names
 stdin stdout stderr
 % close stderr
 % chan names
 stdin stdout
 % set stderr [fifo]
 fifo0
 % chan names
 stderr stdin stdout

Примечание: нет fifo0, но мы получаем желаемую stderr.

Можеткто-то указывает, как воспроизвести поведение в tclsh8.5 в моем приложении Tcl/Tk rs.

1 Ответ

1 голос
/ 11 мая 2011

Так как memchan не создает каналы, зарезервированные дескриптором файла, он не может заменить стандартные каналы (которые всегда соответствуют FD 0, 1 и 2).

...