на главную | войти | регистрация | DMCA | контакты | справка | donate |      

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я


моя полка | жанры | рекомендуем | рейтинг книг | рейтинг авторов | впечатления | новое | форум | сборники | читалки | авторам | добавить



Листинг 15.15. Клиент для сервера, передающего дескриптор

//doors/clientfd1.c

1  #include "unpipc.h"


2  int

3  main(int argc, char **argv)

4  {

5   int door, fd;

6   char argbuf[BUFFSIZE], resbuf[BUFFSIZE], buff[BUFFSIZE];

7   size_t len, n;

8   door_arg_t arg;

9   if (argc != 2)

10   err_quit("usage: clientfd1 ");

11  door = Open(argv[1], O_RDWR); /* открываем дверь */

12  Fgets(argbuf, BUFFSIZE, stdin); /* считываем полное имя открываемого файла */

13  len = strlen(argbuf);

14  if (argbuf[len-1] == '\n')

15   len--;

16  /* подготавливаем аргумент и указатель на результат */

17  arg.data_ptr = argbuf; /* аргумент-данные */

18  arg.data_size = len + 1; /* размер данных */

19  arg.desc_ptr = NULL;

20  arg.desc_num = 0;

21  arg.rbuf = resbuf; /* результаты-данные */

22  arg.rsize = BUFFSIZE; /* размер возвращаемых данных */

23  Door_call(door, &arg); /* вызов процедуры сервера */

24  if (arg.data_size != 0)

25   err_quit("%.*s", arg.data_size, arg.data_ptr);

26  else if (arg.desc_ptr == NULL)

27   err_quit("desc_ptr is NULL");

28  else if (arg.desc_num != 1)

29   err_quit("desc_num = %d", arg.desc_num);

30  else if (arg.desc_ptr->d_attributes != DOOR_DESCRIPTOR)

31   err_quit("d_attributes = %d", arg.desc_ptr->d_attributes);

32  fd = arg.desc_ptr->d_data.d_desc.d_descriptor;

33  while((n = Read(fd, buff, BUFFSIZE)) > 0)

34   Write(STDOUT_FILENO, buff, n);

35  exit(0);

36 }


Пример | UNIX: взаимодействие процессов | Открываем дверь, считываем полное имя файла