Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: отсутствуют хидеры /usr/include/sys  (Прочитано 2086 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн autrich

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
отсутствуют хидеры /usr/include/sys
« : 10 Апреля 2013, 17:53:11 »
Добрый день. Прошу сообщество о помощи. Нужен хидер poll.h
В принципе, он есть в каталоге /usr/include, но он ссылается на sys/poll.h:
#include <sys/poll.h>Проблема в том, что каталог sys в /usr/include отсутствует как таковой.
Попытка установить хидеры командой не дает ровным счетом ничего:
autrich@autrich-R518:~$ sudo apt-get install linux-headers-3.5.0-27-generic
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Уже установлена самая новая версия linux-headers-3.5.0-27-generic.
Следующие пакеты устанавливались автоматически и больше не требуются:
  libclang-common-dev libjavascriptcoregtk-1.0-0 libllvm3.0 libunique-1.0-0
  libwebkitgtk-1.0-0 libwebkitgtk-1.0-common llvm-3.0 llvm-3.0-dev
  llvm-3.0-runtime
Для их удаления используйте «apt-get autoremove».
обновлено 0, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Есть подозрение, что у меня не установлен какой-то модуль.
В принципе, можно сделать симлинки из других папок, в данном случае, например, из /usr/include/i386-linux-gnu/sys, но ведь не на каждый файл...
Как можно добавить заголовочные файлы в /usr/include, может, библиотеку поставить нужно какую-то? Заранее спасибо за ответы.

Оффлайн kupamaan

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: отсутствуют хидеры /usr/include/sys
« Ответ #1 : 10 Апреля 2013, 18:02:04 »
Просто напиши:
#include <poll.h>хедер уже ссылается на:
/usr/include/i386-Linux-gnu/sys.


Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
Re: отсутствуют хидеры /usr/include/sys
« Ответ #2 : 10 Апреля 2013, 18:16:36 »
Есть полезная утилита apt-file, если правильно помню, по умолчанию не установлена. Может показать, в каких пакетах есть заданный файл.

apt-file search sys/poll.h

Оффлайн autrich

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: отсутствуют хидеры /usr/include/sys
« Ответ #3 : 10 Апреля 2013, 23:35:18 »
Цитировать
хедер уже ссылается на:

/usr/include/i386-Linux-gnu/sys

но как? там ведь символической ссылки нет, а внутри файла лишь одна строка:

#include <sys/poll.h>
Цитировать
Есть полезная утилита apt-file
Спасибо, утилитка действительно очень удобная.
Я правильно понимаю, мне нужно скопировать найденный файл в /usr/include/sys?
« Последнее редактирование: 11 Апреля 2013, 00:21:32 от autrich »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: отсутствуют хидеры /usr/include/sys
« Ответ #4 : 11 Апреля 2013, 08:23:35 »
autrich,
Не трогай системные каталоги!
Ничего никуда копировать не надо.
Хочешь разобраться - разбирайся, систему не ломай!
А то потом от тебя воя будет, что ничего не работает на весь форум.

sudo apt-get install build-essentialНеобходимый и достаточный минимум чтобы заниматься разработкой сетевых приложений.

Вот нашел на просторах сети
Код: (C) [Выделить]
#define _GNU_SOURCE
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <poll.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

int ls;

void cleanup(int shut, int s, int howmany)
{
    int retval;

    /*
     * Shutdown and close sock1 completely.
     */
    if (shut) {
        retval = shutdown(s, howmany);
        if (retval == -1)
            perror("shutdown");
    }
    retval = close(s);
    if (retval)
        perror("close");
} /* end cleanup*/

void sighandler(int sig)
{
    if (sig == SIGINT) {
        cleanup(0, ls, 1);
        exit(EXIT_SUCCESS);
    }
}

void declsighandler()
{
    struct sigaction action;
    sigemptyset(&action.sa_mask);
    sigaddset(&action.sa_mask, SIGINT);
    action.sa_flags = 0;
    action.sa_handler = sighandler;
    sigaction(SIGINT, &action, NULL);
}

/*--------------------------------------------------------------------*/
int main(int argc, char **argv)
{
    char message[BUFSIZ];
    struct sockaddr_in s_name; /* Address struct for s.*/
    int opt = 1;
    int retval; /* helpful for debugging */
    socklen_t namelength;
    int atmark;
    struct pollfd *fds = NULL;
    nfds_t nfds;
    int ret;

    /*
     * Check input parameters.
     */
    if (argc != 2) {
        printf("Usage: server portnumber.\n");
        exit(EXIT_FAILURE);
    }

    /*
     * Open socket 2: AF_INET, SOCK_STREAM.
     */
    if ((ls = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    if (setsockopt(ls, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt) < 0) {
        printf("setsockopt (SO_RESUSEADDR): %s\r\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    /*
     * Fill in the name & address structure for socket 2.
     */
    s_name.sin_family = AF_INET;
    s_name.sin_port = htons(atoi(argv[1]));
    s_name.sin_addr.s_addr = htonl(INADDR_ANY);

    /*
     * Bind name to socket 2.
     */
    printf(" \t Bind name to ls. \n");
    retval = bind(ls, (struct sockaddr *) &s_name, sizeof s_name);
    if (retval) {
        perror("bind");
        cleanup(0, ls, 1);
        exit(EXIT_FAILURE);
    }

    /*
     * Listen on socket 2 for connections.
     */
    printf(" \t Listen on ls for connections. \n");
    retval = listen(ls, 5);
    if (retval) {
        perror("listen");
        cleanup(0, ls, 1);
        exit(EXIT_FAILURE);
    }
    declsighandler();
    nfds = 1;
    fds = (struct pollfd *) calloc(1, nfds * sizeof (struct pollfd));
    fds->fd = ls;
    fds->events = POLLIN | POLLPRI;
    for (;;) {
        int i;
        printf("  Selecting ...\n");
        ret = poll(fds, nfds, -1);
        if (ret == -1) {
            perror("poll");
            exit(EXIT_FAILURE);
        }
        for (i = 0; (i < nfds) && (ret); i++) {
            if (!(fds + i)->revents)
                continue;
            printf("  after : revents=0x%x, ret=%d\n\n",
                    (fds + i)->revents,
                    ret);
            ret--;
            if (((fds + i)->fd == ls) && ((fds + i)->revents & POLLIN)) {
                /*
                 * Accept connection from socket ls:
                 * accepted connection will be on socket (fds+nfds)->fd.
                 */
                printf(" \t POLLIN on ls. Accepting connection\n");
                namelength = sizeof (s_name);
                fds = (struct pollfd *) realloc(fds, (nfds + 1) * sizeof (struct pollfd));
                (fds + nfds)->fd = accept(ls, (struct sockaddr *) &s_name, &namelength);
                if ((fds + nfds)->fd == -1) {
                    perror("accept");
                    cleanup(0, (fds + nfds)->fd, 1);
                    fds = (struct pollfd *) realloc(fds, nfds * sizeof (struct pollfd));
                    continue;
                }
                (fds + nfds)->events = POLLIN | POLLPRI | POLLRDBAND | POLLRDNORM | POLLRDHUP;
                nfds++;
                continue;
            }
            if ((fds + i)->revents & POLLNVAL) {
                printf("POLLNVAL on socket. Freeing resource\n");
                nfds--;
                memcpy(fds + i, fds + i + 1, nfds - i);
                fds = (struct pollfd *) realloc(fds, nfds * sizeof (struct pollfd));
                continue;
            }
            if ((fds + i)->revents & POLLHUP) {
                printf("\t POLLHUP => peer reset connection ...\n");
                cleanup(0, (fds + i)->fd, 2);
                nfds--;
                memcpy(fds + i, fds + i + 1, nfds - i);
                fds = (struct pollfd *) realloc(fds, nfds * sizeof (struct pollfd));
                continue;
            }
            if ((fds + i)->revents & POLLRDHUP) {
                printf("\t POLLRDHUP => peer disconnected ...\n");
                cleanup(1, (fds + i)->fd, 2);
                nfds--;
                memcpy(fds + i, fds + i + 1, nfds - i);
                fds = (struct pollfd *) realloc(fds, nfds * sizeof (struct pollfd));
                continue;
            }
            if ((fds + i)->revents & POLLERR) {
                printf("\t POLLERR => peer reset connection ...\n");
                cleanup(0, (fds + i)->fd, 2);
                nfds--;
                memcpy(fds + i, fds + i + 1, nfds - i);
                fds = (struct pollfd *) realloc(fds, nfds * sizeof (struct pollfd));
                continue;
            }
            if ((fds + i)->revents & POLLRDNORM) {
                retval = recv((fds + i)->fd, message, sizeof (message), 0);
                printf(" \t -> (recv) retval = %d.\n", retval); /* ped */
                if (retval <= 0) {
                    if (retval == 0) {
                        printf("\t recv()==0 => peer disconnected...\n");
                        cleanup(1, (fds + i)->fd, 2);
                    } else {
                        perror("\t receive");
                        cleanup(0, (fds + i)->fd, 1);
                    }
                    nfds--;
                    memcpy(fds + i, fds + i + 1, nfds - i);
                    fds = (struct pollfd *) realloc(fds, nfds * sizeof (struct pollfd));
                    continue;
                }
                printf(" \t Normal message :  %.*s\n", retval, message);
                continue;
            }
            if ((fds + i)->revents & (POLLPRI | POLLRDBAND)) {
                retval = recv((fds + i)->fd, message, sizeof (message), MSG_OOB);
                printf(" \t -> (recv) retval = %d.\n", retval); /* ped */
                if (retval == -1 && errno == EINVAL) {
                    ioctl((fds + i)->fd, SIOCATMARK, &atmark);
                    printf("\t \t atmark = %d\n", atmark);
                    printf("\t \t PEEK ret = %Zd\n", recv((fds + i)->fd, message, 1, MSG_PEEK));
                    printf(" \t PEEK message: %c\n", message[0]);
                    errno = 0;
                    continue;
                }
                if (retval <= 0) {
                    if (retval == 0) {
                        printf("\t recv()==0 => peer disconnected...\n");
                        cleanup(1, (fds + i)->fd, 2);
                    } else {
                        perror("\t recv");
                        cleanup(0, (fds + i)->fd, 1);
                    }
                    nfds--;
                    memcpy(fds + i, fds + i + 1, nfds - i);
                    fds = (struct pollfd *) realloc(fds, nfds * sizeof (struct pollfd));
                    continue;
                } else
                    printf(" \t OOB message : %c\n", message[0]);
                continue;
            }
        }
    }
} /* end main */


Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
Re: отсутствуют хидеры /usr/include/sys
« Ответ #5 : 11 Апреля 2013, 10:46:23 »
Цитировать
хедер уже ссылается на:

/usr/include/i386-Linux-gnu/sys

но как? там ведь символической ссылки нет, а внутри файла лишь одна строка:

#include <sys/poll.h>
Цитировать
Есть полезная утилита apt-file
Спасибо, утилитка действительно очень удобная.
Я правильно понимаю, мне нужно скопировать найденный файл в /usr/include/sys?
Нет, надо лишь убедиться, что хотя бы один пакет с нужным инклюдом установлен. И насколько я помню, в 32-битных системах /usr/include/i386-Linux-gnu/ уже находится в списке путей, где компилятор ищет инклюды.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: отсутствуют хидеры /usr/include/sys
« Ответ #6 : 11 Апреля 2013, 10:57:47 »
На самом деле всё проще.

в man'е написано как и какие заголовочные файлы надо подключать
Остальное сделано за вас.

man говорит что делать надо
Код: (C) [Выделить]
#define _GNU_SOURCE
#include <poll.h>
и без выпендрёжа.

Если не сказано специально что необходимо указать компилятору путь где искать заголовочные файлы, значит он и так это прекрасно знает.

От куда ТС придумал
Код: (C) [Выделить]
#include <sys/poll.h> одному только ему известно.

Оффлайн autrich

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: отсутствуют хидеры /usr/include/sys
« Ответ #7 : 11 Апреля 2013, 11:07:44 »
Большое спасибо за помощь. Решение, предложенное Yurror работает, код компилится, все отлично.

Для меня, правда, так и осталось загадкой, как компилятор подключает заголовочные файлы из sys, так как такого каталога в include нет в принципе.
Спасибо всем за помощь!

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: отсутствуют хидеры /usr/include/sys
« Ответ #8 : 12 Апреля 2013, 11:08:00 »
autrich,
Его там и не должно быть
У компилятора много путей по которым он ищет заголовочные файлы

 

Страница сгенерирована за 0.053 секунд. Запросов: 25.