Системное программирование в UNIX средствами Free Pascal


         

закрываем для надежности ненужные каналы:


    exit;

  end;

 

  if not assignpipe(in2,out2) then

  begin

    writeln('Ошибка создания второго программного канала');

    fdclose(in1); (*закрываем ранее созданный канал 1*)

    fdclose(out1);

    exit;

  end;

 

  pid:=fork; (*клонирование процесса*)

 

  if pid=-1 then (*ошибка клонирования*)

  begin

    writeln('Ошибка создания потомка');

    exit;

  end;

  if pid=0 (*сервер - потомок*) then (*ветка потомка*)

  begin

    fdclose(out1);(* закрываем для надежности ненужные каналы:

                    первый - для записи, второй - для чтения*)

    fdclose(in2);

    fdread(in1,filename,80); (*читаем из первого канала имя файла*)

    {}writeln('Сервер: получено имя файла - ',filename);

    if access(filename,f_ok or r_ok) then (*если файл существует и доступен для чтения*)

    begin

      fstat(filename,st);(*получем информацию о файле*)

      filesize:=st.size; (*узнаем размер файла*)

      {}writeln('Сервер: определен размер файла - ',filesize);

      fdwrite(out2,filesize,sizeof(filesize)); (*пишем во второй канал размер файла*)

      {}writeln('Сервер: размер файла записан в канал');

      fd:=fdopen(filename,Open_RDONLY);(*открываем файл для чтения*)

      i:=1;

      kol:=fdread(fd,buf,BLOCKSIZE); (*читаем блоками по BLOCKSIZE байт*)

      while kol>0 do

      begin

        fdwrite(out2,buf,kol); (*пишем во второй канал столько, сколько прочли из файла*)

        {}writeln('Сервер: записано в канал ',i*kol/BLOCKSIZE:1:1,' Kb');

        kol:=fdread(fd,buf,BLOCKSIZE);

      end;

      fdclose(fd);(*закрываем файл*)

      {}writeln('Сервер: файл записан в канал');

    end

    else (*если файл не существует или недоступен для чтения*)

    begin

      filesize:=-1; (*записываем в программный канал признак ошибки*)

      fdwrite(out2,filesize,sizeof(filesize));

    end;

    {}writeln('Сервер: работа завершена');

    halt(0); (*завершаем работу потомка*)

  end

  else     (*клиент - родитель*)  (*ветка родителя*)

  begin


Содержание  Назад  Вперед