долгое время мое понимание о терминал в unix-подобных системах было то, что он запускает процесс оболочки и предоставляет пользовательский интерфейс к нему, общаясь с ним по его stdin,stdout & stderr.
однако в последнее время при рассмотрении проблемы с запуском консольного приложения windows через терминал cygwin, я понимаю, что это может быть не так просто, как это.
At http://cygwin.com/1.5/cygwin-ug-net/using-effectively.html я вижу,
другая проблема-получение выходных данных от или
консольные программы для Windows. К сожалению, взаимодействуя с
Консольные приложения Windows-это не простой вопрос использования
утилита перевода. Консольные приложения Windows предназначены для работы
под command.com или командир.exe, а некоторые не имеют дело изящно с
другие случаи. С Cygwin может получить консоль ввод только если он также
запуск в консоли (DOS box), так как Windows не предоставляет никакого способа
чтобы прикрепить к backend устройства консоли. Другой традиционный
Метод ввода/вывода Unix, ptys (псевдо-терминалы), поддерживается
Cygwin, но не полностью Windows. Основная проблема заключается в том, что Cygwin
pty труба и некоторые применения Windows не любят иметь их
ввод или вывод перенаправляется на каналы.
Я написал небольшую программу на C, который я скомпилирован под windows с использованием VC++ ' S cl.exe -
#include <stdio.h>
int main(int argc, char *argv[]) {
#define BUFFER_LEN 1024
char buffer[BUFFER_LEN];
printf("echo server startedn");
while (fgets(buffer, BUFFER_LEN, stdin) != NULL) {
printf("%s", buffer);
}
return 0;
}
когда я запускаю терминал Cygwin (mintty.exe) и запустить эту программу, я не могу с ней взаимодействовать -
[puneet@freestyle ~]$ /cygdrive/c/echo1.exe
Hello
^-- нет ответа
но когда я положил его в трубу, он работает -
[puneet@freestyle ~]$ echo -e "1n2n3" | /cygdrive/c/echo1.exe | while read line; do echo $line; done
1
2
3
[puneet@freestyle ~]$
в основном он не взаимодействует с mintty.exe терминал. Однако при запуске bash.exe прямо из консоли Windows, это можно корректно взаимодействовать с -
[puneet@freestyle ~]$ /cygdrive/c/echo1.exe
Hello
Hello
^Z
[puneet@freestyle ~]$
Я тогда подумал, если я ssh'd в мою машину и запустить эту программу в качестве команды, он будет работать, как тогда терминал не будет напрямую взаимодействовать с ним, но сервер SSH будет. Однако это тоже не работает -
[puneet@freestyle ~]$ ssh freestyle /cygdrive/c/echo1.exe
Hello
^-- нет ответа
но положить это в трубу снова работает ! -
[puneet@freestyle ~]$ echo -e "1n2n3" | ssh freestyle /cygdrive/c/echo1.exe | while read line; do echo $line; done
1
2
3
[puneet@freestyle ~]$
может ли кто-нибудь объяснить теорию, стоящую за всем этим наблюдения?
это взаимодействие между терминалом и оболочкой больше, чем просто с помощью оболочки stdin,stdout и stderr?
чем отличается консоль windows? Почему консольные программы windows, кажется, работают нормально, когда в трубе с программами cygwin?