Значение POSIX-функции dup2 () со вторым аргументом равно нулю - PullRequest
0 голосов
/ 27 мая 2020

Иногда я вижу странное использование функции dup2(). Например:

    if ((sock= accept(sockfd, (struct sockaddr *)&s_addr, &namelen)) == -1){
                syslog(LOG_ERR, "in accept: %m");
                exit(3);

    }
            dup2(sock, 0);
            close(sockfd);
            sock = 0;

Он даже не проверяет возвращаемое значение. Что именно он делает с такими аргументами? man dup2 говорит, что if newfd (second argument of dup2) was previously open, it is silently closed before being reused. Но 0 - это стандартный ввод, и зачем нам это делать?

1 Ответ

3 голосов
/ 27 мая 2020

На самом деле это довольно распространенная парадигма для настройки программы для работы с сокетом в качестве стандартного ввода.

Само по себе это, вероятно, кажется бессмысленным - почему бы просто не работать с тем, что является дескриптором сокета? - но на практике за ней почти всегда следует операция 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 настроены определенным образом.

ПРИМЕЧАНИЕ: это ужасная идея и очень небезопасная, и единственный раз, когда вы когда-либо видели это по-настоящему, - это вредоносное ПО. Я не решился включить пример здесь, но это настолько ясная иллюстрация, что я подумал, что оно того стоит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...