Майкл Джонсон - Разработка приложений в среде Linux. Второе издание

Тут можно читать онлайн Майкл Джонсон - Разработка приложений в среде Linux. Второе издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство Вильямс, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Разработка приложений в среде Linux. Второе издание
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    978-5-8459-1143-8
  • Рейтинг:
    3.8/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Майкл Джонсон - Разработка приложений в среде Linux. Второе издание краткое содержание

Разработка приложений в среде Linux. Второе издание - описание и краткое содержание, автор Майкл Джонсон, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.

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

Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)

Разработка приложений в среде Linux. Второе издание - читать книгу онлайн бесплатно, автор Майкл Джонсон
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Функция utmpname()используется для определения просматриваемой базы данных. Базой данных по умолчанию является utmp, но вместо этого функцию можно применять для указания на wtmp. Два предопределенных имени — это _PATH_UTMPдля файла utmp и _PATH_WTMPдля файла wtmp; для целей тестирования можно выбрать указатель на локальную копию. Функция utmpname()возвращает ноль в случае успеха и ненулевое значение в случае ошибки. Но успех может означать просто то, что имя файла удалось скопировать в библиотеку; это не означает, что база данных действительно существует в пути, предоставленном для нее.

Функция getutent()просто возвращает следующую строку из базы данных. Если база данных еще не открыта, она возвращает содержимое первой строки. Если строки больше не доступны, она возвращает NULL.

Функция getutid()принимает struct utmpи рассматривает лишь один или два элемента. Если ut_typeявляется BOOT_TIME, OLD_TIMEили NEW_TIME, она возвращает следующую строку этого типа. Если ut_typeявляется INIT_PROCESS, LOGIN_PROCESS, USER_PROCESSили DEAD_PROCESS, тогда getutid()возвращает следующую строку, которая соответствует любому из типов, также имеющему значение ut_id, которое соответствует значению ut_idв struct utmp, передаваемой getutid(). Перед повторным вызовом потребуется удалить из struct utmpданные, возвращаемые getutid(); POSIX разрешает возвращать ту же строку, что и предыдущий вызов. Если соответствующих строк нет, возвращается NULL.

Функция getutline()возвращает следующую строку с ut_id, установленным в LOGIN_PROCESSили USER_PROCESS. Эти процессы тоже имеют значение ut_line, соответствующее значению ut_lineв struct utmp, которая передается в getutline(). Как и в случае getutid(), необходимо удалить данные, возвращаемые getutline(), из struct utmpперед его повторным вызовом; в противном случае POSIX разрешает возвращать ту же строку, что и предыдущий вызов. Если соответствующих строк нет, возвращается NULL.

Функция pututline()модифицирует (или по необходимости добавляет) запись базы данных, соответствующую элементу ut_lineаргумента struct utmp. Она делает это только в том случае, если у процесса есть полномочия на модификацию базы данных. Если модификация базы данных прошла успешно, она возвращает struct utmp, который соответствует данным, записанным в базу. В ином случае возвращается NULL. Функция pututline()не применима к базе данных wtmp. Для модификации базы данных wtmp используйте updwtmp()или logwtmp().

Функция setutent()перемещает внутренний указатель базы данных в начало.

Функция endutent()закрывает базу данных. Это закрывает файловый дескриптор и освобождает ассоциированные данные. Вызывайте endutent()как перед использованием utmpname()для доступа к другому файлу utmp, так и после завершения доступа к данным utmp.

Наиболее надежным способом модификации базы данных wtmp являются две функции, определенные BSD и доступные как часть glibc.

Функция updwtmp()принимает файловое имя базы данных wtmp (обычно _PATH_WTMP) и заполненную структуру struct utmp, пытаясь добавить элемент к файлу wtmp. Эта функция не сообщает об ошибках.

Функция logwtmp()является удобной функцией, заполняющей struct utmpи вызывающей updwtmp()для нее. Аргумент lineкопируется в ut_line, name— в ut_user, host— в ut_host, ut_tvзаполняется текущим показанием времени, a ut_pid— текущим идентификатором процесса. Как и updwtmp(), эта функция не сообщает об ошибках.

В программе utmp демонстрируются некоторые методы чтения баз данных utmp и wtmp.

1: /* utmp.с */

2:

3: #include

4: #include

5: #include

6: #include

7: #include

8: #include

9: #include

10: #include

11: #include

12: #include

13: #include

14:

15: void print_utmp_entry(struct utmp * u) {

16: struct tm *tp;

17: char * type;

18: char addrtext[INET6_ADDRSTRLEN];

19:

20: switch (u->ut_type) {

21: case EMPTY: type = "EMPTY"; break;

22: case RUN_LVL: type = "RUN_LVL"; break;

23: case BOOT_TIME: type = "BOOT_TIME"; break;

24: case NEW_TIME: type = "NEW_TIME"; break;

25: case OLD_TIME: type = "OLD_TIME"; break;

26: case INIT_PROCESS: type = "INIT_PROCESS"; break;

27: case LOGIN_PROCESS: type = "LOGIN_PROCESS"; break;

28: case USER_PROCESS: type = "USER_PROCESS"; break;

29: case DEAD_PROCESS: type = "DEAD_PROCESS"; break;

30: case ACCOUNTING: type = "ACCOUNTING "; break;

31: }

32: printf("%-13s:", type);

33: switch (u->ut_type) {

34: case LOGIN_PROCESS:

35: case USER_PROCESS:

36: case DEAD_PROCESS:

37: printf(" line: %s", u->ut_line);

38: /* fall through */

39: case INIT_PROCESS:

40: printf("\n pid: %6d id: %4.4s", u->ut_pid, u->ut_id);

41: }

42: printf ("\n");

43: tp = gmtime(&u->ut_tv.tv_sec);

44: printf("time: %24.24s.%lu\n", asctime(tp), u->ut_tv.tv_usec);

45: switch (u->ut_type) {

46: case USER_PROCESS:

47: case LOGIN_PROCESS:

48: case RUN_LVL:

49: case BOOT_TIME:

50: printf("пользователь: %s\n", u->ut_user);

51: }

52: if (u->ut_type == USER_PROCESS) {

53: if (u->ut_session)

54: printf(" сеанс: %lu\n", u->ut_session);

55: if (u->ut_host)

56: printf (" хост: %s\n", u->ut_host);

57: if (u->ut_addr_v6[0]) {

58: if (!(u->ut_addr_v6[1] |

59: u->ut_addr_v6[2] |

60: u->ut_addr_v6[3])) {

61: /* заполнение только первой группы означает адрес IPV4 */

62: inet_ntop(AF_INET, u->ut_addr_v6,

63: addrtext, sizeof(addrtext));

64: printf(" IPV4: %s\n", addrtext);

65: } else {

66: inet_ntop(AF_INET_6, u->ut_addr_v6,

67: addrtext, sizeof(addrtext));

68: printf (" IPV6: %s\n", addrtext);

69: }

70: }

71: }

72: if (u->ut_type == DEAD_PROCESS) {

73: printf(" завершение : %u: %u\n",

74: u->ut_exit.e_termination,

75: u->ut_exit.e_exit);

76: }

77: printf("\n");

78: }

79:

80: struct utmp * get_next_line (char * id, char * line) {

81: struct utmp request;

82:

83: if (!id && !line)

84: return getutent();

85:

86: memset(&request, 0, sizeof(request));

87:

88: if (line) {

89: strncpy(&request.ut_line[0], line, UT_LINESIZE);

90: return getutline(&request);

91: }

92:

93: request.ut_type = INIT_PROCESS;

94: strncpy(&request.ut_id[0], id, 4);

95: return getutid(&request);

96: }

97:

98: void print_file(char * name, char * id, char * line) {

99: struct utmp * u;

100:

101: if (utmpname(name)) {

102: fprintf (stderr, "сбой при открытии базы данных utmp %s\n", name);

103: return;

104: }

105: setutent();

106: printf("%s:\n====================\n", name);

107: while ((u = get_next_line(id, line))) {

108: print_utmp_entry(u);

109: /* POSIX требует очистки статических данных перед

110: * повторным вызовом getutline или getutid

111: */

112: memset(u, 0, sizeof(struct utmp));

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Майкл Джонсон читать все книги автора по порядку

Майкл Джонсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Разработка приложений в среде Linux. Второе издание отзывы


Отзывы читателей о книге Разработка приложений в среде Linux. Второе издание, автор: Майкл Джонсон. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x