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

Интервал:

Закладка:

Сделать

Два элемента, которые мы пропустили, msg_controlи msg_controllenпредоставляют возможность передачи файлового дескриптора. Член msg_controlуказывает на массив заголовков управляющих сообщений; msg_controllenустанавливает количество байт, которые содержит массив. Каждое управляющее сообщение состоит из структуры struct cmsghdr, которая сопровождается дополнительными данными.

#include

struct cmsghdr {

unsigned int cmsg_len; /* длина управляющего сообщения */

int cmsg_level; /* SOL_SOCKET */

int cmsg_type; /* SCM_RIGHTS */

int cmsg_data[0]; /* здесь должен быть файловый дескриптор */

};

Размер управляющего сообщения, включая заголовок, хранится в переменной cmsg_len. В текущий момент определен только один тип управляющих сообщений — SCM_RIGHTS, который передает файловые дескрипторы [125] Это иногда называется передачей прав доступа. . Для данного типа сообщений параметры cmsg_levelи cmsg_type должны быть равны соответственно SOL_SOCKETи SCM_RIGHTS. Последний член cmsg_dataявляется массивом нулевого размера. Это расширение gcc, которое позволяет приложению копировать данные в конец структуры (в следующей программе показан пример).

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

Для иллюстрации использования таких вложенных структур мы написали пример программы, которая по нашей прихоти названа просто cat. Она принимает имя файла в качестве единственного аргумента, открывает указанный файл в дочернем процессе и передает результирующий файловый дескриптор в родительский процесс через сокет домена Unix. Родительский процесс затем копирует файл на стандартный вывод. Имя файла посылается вместе с файловым дескриптором с демонстрационной целью.

1: /* passfd.с */

2:

3: /* Программа ведет себя подобно обычной команде /bin/cat, которая обрабатывает

4: только один аргумент (имя файла). Мы создаем сокеты домена Unix при помощи

5: socketpair(), затем разветвляем через fork(). Дочерний процесс открывает файл,

6: имя которого передается в командной строке, пересылает файловый дескриптор и

7: имя файла обратно в порождающий процесс, после этого завершается. Родительский

8: процесс ожидает файловый дескриптор от дочернего процесса, а потом копирует

9: данные из файлового дескриптора в stdout до тех пор, пока данные не

10: заканчиваются. Затем родительский процесс завершается. */

11:

12: #include

13: #include

14: #include

15: #include

16: #include

17: #include

18: #include

19: #include

20: #include

21:

22: #include "sockutil.h" /* простые служебные функции */

23:

24: /* Дочерний процесс. Он пересылает файловый дескриптор. */

25: int childProcess(char * filename, int sock) {

26: int fd;

27: struct iovec vector; /* некоторые данные для передачи fd в w/ */

28: struct msghdr msg; /* полное сообщение */

29: struct cmsghdr * cmsg; /* управляющее сообщение, которое */

30: /* включает в себя fd */

31:

32: /* Открыть файл, дескриптор которого будет передан. */

33: if ((fd = open(filename, O_RDONLY)) < 0) {

34: perror("open");

35: return 1;

36: }

37:

38: /* Передать имя файла через сокет, включая завершающий

39: символ '\0' */

40: vector.iov_base = filename;

41: vector.iov_len = strlen(filename) + 1;

42:

43: /* Соединить первую часть сообщения. Включить

44: имя файла iovec */

45: msg.msg_name = NULL;

46: msg.msg_namelen = 0;

47: msg.msg_iov = &vector;

48: msg.msg_iovlen = 1;

49:

50: /* Теперь управляющее сообщение. Мы должны выделить участок памяти

51: для файлового дескриптора. */

52: cmsg = alloca(sizeof(struct cmsghdr) + sizeof(fd));

53: cmsg->cmsg_len = sizeof(struct cmsghdr) + sizeof(fd);

54: cmsg->cmsg_level = SOL_SOCKET;

55: cmsg->cmsg_type = SCM_RIGHTS;

56:

57: /* Копировать файловый дескриптор в конец

58: управляющего сообщения */

59: memcpy(CMSG_DATA(cmsg), &fd, sizeof(fd));

60:

61: msg.msg_control = cmsg;

62: msg.msg_controllen = cmsg->cmsg_len;

63:

64: if (sendmsg(sock, &msg, 0) != vector.iov_len)

65: die("sendmsg");

66:

67: return 0;

68: }

69:

70: /* Родительский процесс. Он получает файловый дескриптор. */

71: int parentProcess(int sock) {

72: char buf[80]; /* пространство для передачи имени файла */

73: struct iovec vector; /* имя файла от дочернего процесса */

74: struct msghdr msg; /* полное сообщение */

75: struct cmsghdr * cmsg; /* управляющее сообщение с fd */

76: int fd;

77:

78: /* установка iovec для имени файла */

79: vector.iov_base = buf;

80: vector.iov_len = 80;

81:

82: /* сообщение, которое мы хотим получить */

83:

84: msg.msg_name = NULL;

85: msg.msg_namelen = 0;

86: msg.msg_iov = &vector;

87: msg.msg_iovlen = 1;

88:

89: /* динамическое распределение (чтобы мы могли выделить участок

90: памяти для файлового дескриптора) */

91: cmsg = alloca(sizeof(struct cmsghdr) + sizeof(fd));

92: cmsg->cmsg_len = sizeof(struct cmsghdr) + sizeof(fd);

93: msg.msg_control = cmsg;

94: msg.msg_controllen = cmsg->cmsg_len;

95:

96: if (!recvmsg(sock, &msg, 0))

97: return 1;

98:

99: printf("получен файловый дескриптор для '%s'\n",

100: (char *) vector.iov_base);

101:

102: /* присвоение файлового дескриптора из управляющей структуры */

103: memcpy(&fd, CMSG_DATA(cmsg), sizeof(fd));

104:

105: copyData(fd, 1);

106:

107: return 0;

108: }

109:

110: int main(int argc, char ** argv) {

111: int socks[2];

112: int status;

113:

114: if (argc != 2) {

115: fprintf(stderr, "поддерживается только один аргумент\n");

116: return 1;

117: }

118:

119: /* Создание сокетов. Один служит для родительского процесса,

120: второй — для дочернего (мы можем поменять их местами,

121: если нужно). */

122: if (socketpair(PF_UNIX, SOCK_STREAM, 0, socks))

123: die("socketpair");

124:

125: if (!fork()) {

126: /* дочерний процесс */

127: close(socks[0]);

128: return childProcess(argv[1], socks[1]);

129: }

130:

131: /* родительский процесс */

132: close(socks[1]);

133: parentProcess(socks[0]);

134:

135: /* закрытие дочернего процесса */

136: wait(&status);

137:

138: if (WEXITSTATUS(status))

139: fprintf(stderr, "childfailed\n");

140:

141: return 0;

142: }

17.5. Сетевая обработка с помощью TCP/IP

Самое важное применение сокетов заключается в том, что они позволяют приложениям, работающим на основе различных механизмов, общаться друг с другом. Семейство протоколов TCP/IP [34] используется в Internet самым большим в мире числом компьютеров, объединенных в сеть. Система Linux предлагает полную устойчивую реализацию TCP/IP, которая позволяет действовать и как сервер, и как клиент TCP/IP.

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

Интервал:

Закладка:

Сделать


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

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




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


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


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

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