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


Каналы и системный вызов ехес - часть 3


      fdclose (fdin);        (* сохранить дескрипторы файлов *)

      fdclose (fdout);

      execvp (com1[0], com1, envp);

      (* Если execvp возвращает значение, то произошла ошибка *)

      fatal ('Ошибка 1 вызова execvp в программе join');

    end;

    else

    begin

      (* процесс, выполняющий чтение *)

      dup2 (fdin, 0);        (* направить ст. ввод из канала *)

      fdclose (fdin);

      fdclose (fdout);

      execvp (com2[0], com2, envp);

      fatal ('Ошибка 2 вызова execvp в программе join');

    end;

  end;

end;

Эту процедуру можно вызвать следующим образом:

uses linux, stdio;

 

const

  one:array [0..3] of pchar = ('ls', '-l', '/usr/lib', nil);

  two:array [0..2] of pchar = ('grep', '^d', nil);

var

  ret:integer;

begin

  ret := join (one, two);

  writeln ('Возврат из программы join ', ret);

  halt (0);

end.

Упражнение 7.3. Как можно обобщить подход, показанный в программе join, для связи нескольких процессов при помощи каналов?

Упражнение 7.4. Добавьте возможность работы с каналами в командный интерпретатор smallsh, представленный в предыдущей главе.

Упражнение 7.5. Придумайте метод, позволяющий родительскому процессу запускать программу в качестве дочернего процесса, а затем считывать ее стандартный вывод при помощи канала. Стоит отметить, что эта идея лежит в основе процедур popen/pipeopen и pclose/pipeclose, которые входят в стандартную библиотеку ввода/вывода. Процедуры popen/pipeopen и pclose/pipeclose избавляют программиста от большинства утомительных деталей согласования вызовов fork, ехес, fdclose, dup или dup2. Эти процедуры обсуждаются в главе 11.




- Начало -  - Назад -  - Вперед -