На самом деле это довольно распространенная парадигма для настройки программы для работы с сокетом в качестве стандартного ввода.
Само по себе это, вероятно, кажется бессмысленным - почему бы просто не работать с тем, что является дескриптором сокета? - но на практике за ней почти всегда следует операция fork()
, которая запускает некоторый дочерний процесс, который ожидает чтения со стандартного ввода.
Poof - теперь он работает с сокетом.
Вероятно, вы увидите, что stdout обрабатывается аналогичным образом.
EDIT: Супер простой пример - сетевая служба, которая предлагает вам оболочку после того, как вы примете TCP-соединение:
...
if ((sock= accept(sockfd, (struct sockaddr *)&s_addr, &namelen)) == -1){
syslog(LOG_ERR, "in accept: %m");
exit(3);
}
dup2(sock, 0); // stdin
dup2(sock, 1); // stdout
dup2(sock, 2); // stderr
close(sock);
system("/bin/sh"); // terrible security
Итак, теперь, когда вы подключаетесь к нему - возможно, с помощью te lnet от клиента - у вас есть своего рода оболочка, которая имеет то, что кажется традиционным stdin / out / err, и все они подключены к сокету.
Дело в том, что вы видите, что это в основном используется только тогда, когда нужно выполнить некоторый дочерний процесс , где предполагается, что файловые дескрипторы 0/1/2 настроены определенным образом.
ПРИМЕЧАНИЕ: это ужасная идея и очень небезопасная, и единственный раз, когда вы когда-либо видели это по-настоящему, - это вредоносное ПО. Я не решился включить пример здесь, но это настолько ясная иллюстрация, что я подумал, что оно того стоит.